我是靠谱客的博主 兴奋黑猫,这篇文章主要介绍Jetpack系列之ViewModel详解,现在分享给大家,希望可以做个参考。

一、概述

ViewModel 通过 ViewModelProvider(this).get(XXViewModel::class.java)获取, 这里的this可以是XXActivity/ XXFragment/.., 因为它们都实现了ViewModelStoreOwner接口,而ViewModelStoreOwner又持有ViewModelStore,其实就是个缓存viewmodel的一个hashmap(key为"$DEFAULT_KEY:$modelClass.canonicalName"); 这里的XXViewModel::class.java,就是我们定义的modelClass, 调用get方法来获取我们需要的 viewmodel 的实例(内部先判断 modelClass.isInstance(store[key] )缓存中是否已经存在这样的实例,有则直接用,无则创建)。 通过上面分析,由于key为"$DEFAULT_KEY:$modelClass.canonicalName"在同一个class中是唯一的,这样我们就可以把它放在一个activity中,由其fragment访问就可以实现viewmodel的数据共享。

另外由于XXActivity继承了ComponentActivity(持有mLifecycleRegistry对象),LifecycleRegistry是Lifecycle唯一子类实现,可以处理多个观察者的生命周期实现。

在ComponentActivity的onCreate中有调用ReportFragment.injectIfNeededIn(this)用来监听和分发Activitty生命周期的(大致流程:handleLifecycleEvent —> moveToState—> sync—> dispatchEvent—>onStateChanged),这样在CommponentActivity添加lifecycly.addObserver(),比如监听页面销毁onDestroy。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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(); } } } });

可以看到页面销毁onDestory事件分发后,会判断如果不是由于Configurations变化(如横竖屏切换)导致的才会去销毁当前页面使用的所有ViewModel(不至于内存泄露), 反之不销毁。

二、小结

1. ViewModel的生命周期比Activity要长一些;

2. Configurations变化时,可以用viewmodel来临时缓存一些数据;

3. 由于持有LifecycleRegistry对象,使viewmodel具有所谓的“感知生命周期”能力;

4. 感觉比bundle更好用,bundle传个对象需要序列化。

总结:viewmodel 就是一个寄生在Lifecycle的页面间"传递数据"的工具。

最后

以上就是兴奋黑猫最近收集整理的关于Jetpack系列之ViewModel详解的全部内容,更多相关Jetpack系列之ViewModel详解内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部