我使用调试点来找出
ViewModel
的 onCleared 和 Activity 的 onDestroy()
的顺序。
因为 ComponentActivity
类具有以下代码,所以我知道 ViewModel
的 onCleared()
被调用,然后 Activity 的 onDestroy()
回调。
getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_DESTROY) {
// Clear out the available context
mContextAwareHelper.clearAvailableContext();
// And clear the ViewModelStore
if (!isChangingConfigurations()) {
getViewModelStore().clear(); <- check
}
mReportFullyDrawnExecutor.activityDestroyed();
}
}
});
我不明白 Android 开发者文档中的
ViewModel
图表说明 图 1。 链接
我认为更改 Activity 的
onDestroy()
和 ViewModel
的 onCleared()
的顺序,如 图 2。
为什么图解是这样图1?
首先要了解的是 销毁 Android Activity 与销毁对象实例不同。
活动实例仍然存在,它现在处于无法用它做任何更有用的事情的状态。
该观察者在调用
onDestroy
时被调用,因此该图是正确的,因为 Activity.onDestroy()
是在 before ViewModel.onCleared()
调用的
显示
ViewModel.onCleared()
是在 Activity.onDestroy()
的上下文中调用可能更正确
该图试图表达的观点是:如果您有一个生命周期感知的视图模型观察者,
onDestroy()
将使其在视图模型被清除之前正确退出。
mReportFullyDrawnExecutor
是一个帮助器,通知应用程序的其他部分活动绘制操作已完成,显然需要通知它所关注的活动已被销毁。 这只是一个通知;可以肯定地说 onDestroy()
的大部分工作此时已经完成。