【问题标题】:Kotlin Objects loading delayKotlin 对象加载延迟
【发布时间】:2017-08-04 09:21:44
【问题描述】:

我有一个奇怪的问题,我在 Android 中有一个初始登录活动,而它的 onCreateMethod 被触发,我由 Object 类调用,它是一个名为 BaseData 的静态对象。我收到一个奇怪的空错误,而它是一个对象。发现 Kotlin 中的对象是延迟加载的,这需要一段时间,我如何强制它先加载并在我的主 Landing Login Activity 创建时可用。

class LoginActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    if(BaseData.userId == “”) { //At this step BaseData itself comes as null, so app goes blank
         //Do something
    }
  }
}

object BaseData : Observable() {
var initialSyncDone:Boolean = false
var isOffline:Boolean = true
var userId: String = “”

init{
   // I have logic to load userId from shared preferences
 }
}

【问题讨论】:

  • //At this step BaseData itself comes as null, so app goes blank — 如果 BaseData 为空,BaseData.userId 将导致 NullPointerException。 Kotlin 的延迟对象加载基于 JVM 类加载——你根本不会注意到这种延迟。

标签: android kotlin kotlin-android-extensions


【解决方案1】:

我认为您无法从 BaseData 对象的 init 块访问共享首选项。

【讨论】:

  • 初始化块工作,但调试流程没有发生,因为共享首选项有一个类,我正在使用 gson.From 将字符串转换为 kotlin 对象。
【解决方案2】:

发现对象在 Kotlin 中是延迟加载的,需要一段时间

这不是延迟加载的意思。这意味着如果不在代码中使用对象,它们将不会被类加载。如果userId 只与 Kotlin 代码交互,则它不可能为 null。

【讨论】:

  • 嘿,我发现了问题,你是对的,这不是延迟加载。问题在于将 Json 保存在共享首选项上并检索回来的转换问题之一。所以这是通过 BaseData 的 init 方法发生的。因此,一旦我修复了 gson.From 在 kotlin 中,它就开始工作了。
  • 但是在这种情况下调试并没有发生,我对问题出在哪里感到困惑,因为它没有遇到任何调试点。我继续尝试和错误方法直接访问共享首选项并在调试中间评估表达式以找到问题。所以 Android Studio 没有直接抛出错误
【解决方案3】:

我已经用代码解决了问题。我无法调试也没有错误,只是一个纯黑屏,所以我假设对象是延迟加载的,但实际上不是。 Object 中的 init 函数也在发生,

但在从 json 检索到 Kotlin 对象的 SharePreferences 检索时发生崩溃,但没有引发错误并且模拟器上的黑屏是混乱的。 Android Studio 中更好的调试支持可能会有所帮助,并且需要改进的范围。

所以我随机通过评估表达式,确定问题是在 getPref 方法和最后添加而不是帮助,仍然没有研究 reified 的含义,很快就会这样做。

但在代码中的这些更改完成后关闭问题已解决,如下所示:

class LoginActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
BaseData.loadPrefData()
if(BaseData.userId == “”) { 
     //Do something
  }
 }
}

object BaseData : Observable() {
var initialSyncDone:Boolean = false
var isOffline:Boolean = true
var userId: String = “”

fun loadPrefData // init works but debugging was not happening so no errors before
 {
   if(Preferences.pref!!.contains("user")) {
     userId = if(Preferences.getPref<User>("user") != null) Preferences.getPref<User>("user")!!.id!! else ""
 }
}

// Preference class get from SharePreferences
// **reified** was the missing one, i didn't had before, so it was 
// crashing to convert from Preferences back to Kotlin Object, but no debug errors.
inline fun <reified T> getPref(key:String) : T?{
    val gson = Gson()
    val jsonString = pref!!.getString(key,"")
    if(jsonString != "") {
        val type = object : TypeToken<T>() {}.type
        return gson.fromJson<T>(jsonString, type)
    }
    else
        return null
}

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多