Loading

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);
}

 

二、ViewModel的实例共享

ViewModel是否为同个对象,主要看:

new ViewModelProvider(activity)

    public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
        this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
                ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
                : NewInstanceFactory.getInstance());
    }

看owner.getViewModelStore()是否为同一个,所以最终还是看new ViewModelProvider(activity)传进这里的activity是否为同一个。

 

1、如果Fragment创建ViewModel的时候传递的是activity,那么Fragment将于Activity共享一个ViewModel。

 

2、如果Fragment创建ViewModel的时候传递的是父Fragment的context,那将与父Fragment共享一个ViewModel。

posted @ 2022-02-21 21:23  妖久  阅读(461)  评论(0编辑  收藏  举报