我有一个奇怪的问题,我在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
}
}
答案 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
}