Kotlin对象加载延迟

时间:2017-08-04 09:21:44

标签: android kotlin kotlin-android-extensions

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

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
 }
}

3 个答案:

答案 0 :(得分:1)

I think you can't access shared preference from init block of BaseData object.

答案 1 :(得分:0)

  

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

这不是延迟加载的意思。这意味着如果不在代码中使用对象,则不会对其进行类加载。如果userId仅与Kotlin代码交互,则Add "Open with Code" action to Windows Explorer file context menu Add "Open with Code" action to Windows Explorer directory context menu 无法为空。

答案 2 :(得分:0)

我用代码解决了问题。我无法调试也无法获得错误,只是一个普通的黑屏,所以我假设对象是延迟加载的,但实际上并非如此。对象中的init函数也正在发生,

但是在从Json回到Kotlin对象的SharePreferences检索中发生了崩溃,但没有抛出错误,模拟器上的黑屏是混乱。可能是Android Studio中更好的调试支持可能有助于此处和所需的改进范围。

因此,我随机通过评估表达式,以确定问题是在getPref方法和atlast添加而不是帮助,仍然尚未研究具体意味着什么,将很快做到这一点。

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

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
}