小蚂蚁 发表于 2022-2-21 21:35:33

Jetpack的ViewModel与LiveData总结

本文基于SDK 29
一、ViewModel与LiveData的作用:
1、viewModel:
数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据。
2、LiveData:
感知生命周期并且通知观察者刷新,防止内存泄漏。
一下用流程图的方式说明一下其是怎么工作的:
1、ViewModel的构造:

2、LiveData注册监听:

3、数据改变通知刷新:
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);
}

   
   
   
                        

https://www.cnblogs.com/tangZH/p/14175199.html
页: [1]
查看完整版本: Jetpack的ViewModel与LiveData总结