Jetpack的ViewModel与LiveData总结

本文基于SDK 29

一、ViewModel与LiveData的作用:

1、viewModel:

数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据。

 

2、LiveData:

感知生命周期并且通知观察者刷新,防止内存泄漏。

 

一下用流程图的方式说明一下其是怎么工作的:

1、ViewModel的构造:

Jetpack的ViewModel与LiveData总结

 

 2、LiveData注册监听:

Jetpack的ViewModel与LiveData总结

 

3、数据改变通知刷新:

LiveData中:

Jetpack的ViewModel与LiveData总结

 

总结:

1、ViewMode之所以能够共享数据,是因为其被放在ViewModelStore 中,而ViewModelStore 被放在NonConfigurationInstances(Activity中)这个静态类中。

2、如果Activity被销毁,那么viewModel会被清除,如果是由于横竖屏切换引起的就不会。

if (event == Lifecycle.Event.ON_DESTROY) {
    if (!isChangingConfigurations()) {
        getViewModelStore().clear();
    }

3、LiveDate.observe注册观察者的时候,观察者不但会被存放在LiveData的SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers中,而且还会被放在ComponentActivity的LifecycleRegistry中的

FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap中。

当生命周期进入destroy的时候,会获取LifecycleRegistry的mObserverMap,获取LiveData中的LifecycleBoundObserver并调用onStateChanged方法,将SafeIterableMap中的observer移除,再将LifecycleRegistry的FastSafeIterableMap中的

observer移除。

4、一个observer可以重复被添加,所以注意在一个Activity或者Fragment中只调用一次LiveDate.observe,否则会有多次回调。

5、每次LiveData进行setValue的时候,mVersion++,在回调之前进行判断(

observer.mLastVersion >= mVersion

)防止没有setValue刷新数据却在生命周期变换的时候进行回调。

6、生命周期至少得在onStart才会回调observer,即onStart和onResume可以,其它生命周期不行。

boolean shouldBeActive() {
    return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}

 

上一篇:对比学习(Contrastive Learning) (2)


下一篇:【quartz】quartz的基本使用