Ana*_*ula 11 android android-mvvm android-livedata android-viewmodel
我在Android LiveData 文档中阅读了以下内容:
您可以使用 observeForever(Observer) 方法注册一个没有关联 LifecycleOwner 对象的观察者。在这种情况下,观察者被视为始终处于活动状态,因此始终会收到有关修改的通知。您可以调用 removeObserver(Observer) 方法删除这些观察者。
我正在使用 MVVM 架构模式构建一个应用程序,使用ViewModel并在我的 ViewModel 类中声明 LiveDatas。在我的 viewModel 中,我将 aobserveForever设置为 LiveData:
val password by lazy {
MutableLiveData<String>()
}
init {
initObservable()
}
private fun initObservable() {
password.observeForever {
...
}
}
Run Code Online (Sandbox Code Playgroud)
根据我从文档中的理解,每次实例化 ViewModel 的视图(使用前面的代码)被销毁时,我都应该删除观察者,对吗?但是一旦视图被销毁,观察者不应该被销毁(因为 ViewModel 实例在视图中被实例化并且也会被销毁)?
San*_*Lee 21
“每次实例化 ViewModel 的视图(使用前面的代码)被销毁时,我都应该删除观察者,对吗?”
如果您LiveData在ViewModel 中使用observeForever(observer)以下方法观察 a :
onCleared()在不需要 ViewModel 时调用,因此您应该在此处处理移除观察者。如果你观察LiveData在查看使用observe(lifecyclerowner, observer)
“但是一旦视图被销毁,观察者不应该被销毁(因为 ViewModel 实例在视图中被实例化并且也会被销毁)?”
这个问题比 Android 更像是 Java 问题。
想想“被摧毁”是什么意思。当一个 View 或 ViewModel 被 Android Framework 销毁时,并不意味着该对象完全从内存中移除。只要有其他对象(例如观察者)引用它们,您的活动和片段就不会被垃圾收集。
如果调用observe(activity, observer),那么Android Framework 可以跟踪activity实例和observer实例之间的连接,因此它可以observer在想要杀死时杀死activity。但是,如果您只是调用observeForever(observer),Android 框架根本无法判断此观察者属于哪个对象。
| 归档时间: |
|
| 查看次数: |
7726 次 |
| 最近记录: |