概述
一、概述
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详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复