Kotlin 对象加载延迟

Kotlin Objects loading delay

我有一个奇怪的问题,我在 Android 中有一个初始登录 activity,而它的 onCreateMethod 被触发,我在其中调用了静态对象 class名为 BaseData 的对象。我得到一个奇怪的空错误,而它是一个对象。发现对象在 Kotlin 中延迟加载需要一段时间,我如何强制它首先加载并在我的主登录登录 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
 }
}

Found that objects are lazy loaded in Kotlin which takes a while

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

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

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

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

所以我随机评估了表达式,确定问题出在 getPref 方法上,最后添加而不是帮助,仍然没有研究具体化的意思,很快就会做。

但在对代码进行如下更改后,问题已解决:

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
}