一、LiveDate和Activity的关系
1、LiveData的通常用法
this,通常传入的是Activity的引用
liveData.observe(this, object:Observer)
图1
而ComponentActivity实现了LifecycleOwner接口。
图2
observe方法中传入的Observer对象,被包装成了一个LifecycleObserver类型的对象,添加到了
Activity的生命周期观察者的列表里面
最终: LiveData 将 LifeCycleOwener(Activity)和 Observer绑定到了一起。
图3
二、ViewModel和Activity的关系。
1、概述
ViewModel和Activity以及Fragment的关联是通过ViewModelProvider,最终还是和Activity或者Fragment的生命周期关联了起来.
2、如何正确的创建一个ViewModel
2.1、错误的方式:
不能使用
图4
的方式实例化 ViewModel。因为这样实例化出来的 ViewModel 不能在屏幕旋转后仍然保持有效;同时也不会使得 ViewModel的onCleared() 方法被回调; 再次,如果使用了 viewModelScope 发起协程的话,也不会使得协程被取消。因为这样创建出来的实例没有被添加到Activity的ViewModeStore中。
图5
在onDestory的时候,调用ViewModelStore的clear()方法。
clear()方法遍历了所有的ViewModel,且分别调用了ViewModel的clear()方法。
图6
图7
最终,调用了ViewModel保存的一些Tag对象的的close方法,如viewModelScope或得的
图8
是一个CloseableCoroutineScope,实现了Cloaseable接口。close方法,调用了协助程上下文的cancel()方法。
图9