ViewModel实例化导致死循环
ViewModel Instantiation Causes Infinite Loop
我正在使用我之前使用过几次的模式来实例化 ViewModel
对象。在这种情况下,数据在 SharedPreferences
中保存为字符串。我只需要读取该字符串,将其解析为正确的对象,然后将该对象作为值分配给我的视图模型。
但是当我做作业时,我创建了一个无限循环。
class UserDataViewModel(private val prefs: SharedPreferences): ViewModel() {
val userData: MutableLiveData<UserData> by lazy {
MutableLiveData<UserData>().also {
val userDataString = prefs.getString(Authenticator.USER_DATA, "")
val ud = Gson().fromJson(userDataString, UserData::class.java)
userData.value = ud // infinite loop is here
}
}
fun getUserData(): LiveData<UserData> {
return userData
}
}
这是在保持对 ViewModel
的引用的片段的 onCreateView()
中:
userDataViewModel = activity?.run {
ViewModelProviders
.of(this, UserDataViewModelFactory(prefs))
.get(UserDataViewModel::class.java)
} ?: throw Exception("Invalid Activity")
userDataViewModel
.getUserData()
.observe(this, Observer {
binding.userData = userDataViewModel.userData.value
})
FWIW,在片段中,我在 getUserData()
和 binding.userData...
上都有断点。最后一个被击中的断点在 getUserData()
.
我没有看到循环是在哪里创建的。感谢您的帮助。
userData
字段仅在 by lazy {}
块 returns 中初始化一次。您正在从 by lazy {}
块中访问 userData
字段,这就是创建循环的原因 - 内部访问发现它尚未完成初始化,因此它再次运行该块......又一次。
相反,您可以通过使用 it
而不是 userData
来访问您在 also
块中修改的 MutableLiveData
,打破循环:
val userData: MutableLiveData<UserData> by lazy {
MutableLiveData<UserData>().also {
val userDataString = prefs.getString(Authenticator.USER_DATA, "")
val ud = Gson().fromJson(userDataString, UserData::class.java)
it.value = ud
}
}
我正在使用我之前使用过几次的模式来实例化 ViewModel
对象。在这种情况下,数据在 SharedPreferences
中保存为字符串。我只需要读取该字符串,将其解析为正确的对象,然后将该对象作为值分配给我的视图模型。
但是当我做作业时,我创建了一个无限循环。
class UserDataViewModel(private val prefs: SharedPreferences): ViewModel() {
val userData: MutableLiveData<UserData> by lazy {
MutableLiveData<UserData>().also {
val userDataString = prefs.getString(Authenticator.USER_DATA, "")
val ud = Gson().fromJson(userDataString, UserData::class.java)
userData.value = ud // infinite loop is here
}
}
fun getUserData(): LiveData<UserData> {
return userData
}
}
这是在保持对 ViewModel
的引用的片段的 onCreateView()
中:
userDataViewModel = activity?.run {
ViewModelProviders
.of(this, UserDataViewModelFactory(prefs))
.get(UserDataViewModel::class.java)
} ?: throw Exception("Invalid Activity")
userDataViewModel
.getUserData()
.observe(this, Observer {
binding.userData = userDataViewModel.userData.value
})
FWIW,在片段中,我在 getUserData()
和 binding.userData...
上都有断点。最后一个被击中的断点在 getUserData()
.
我没有看到循环是在哪里创建的。感谢您的帮助。
userData
字段仅在 by lazy {}
块 returns 中初始化一次。您正在从 by lazy {}
块中访问 userData
字段,这就是创建循环的原因 - 内部访问发现它尚未完成初始化,因此它再次运行该块......又一次。
相反,您可以通过使用 it
而不是 userData
来访问您在 also
块中修改的 MutableLiveData
,打破循环:
val userData: MutableLiveData<UserData> by lazy {
MutableLiveData<UserData>().also {
val userDataString = prefs.getString(Authenticator.USER_DATA, "")
val ud = Gson().fromJson(userDataString, UserData::class.java)
it.value = ud
}
}