我是靠谱客的博主 兴奋黑猫,最近开发中收集的这篇文章主要介绍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。

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详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部