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