本文基于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。

Jetpack的ViewModel与LiveData总结的更多相关文章

  1. Jetpack的ViewModel与LiveData

    本文基于SDK 29 一.ViewModel与LiveData的作用: 1.viewModel: 数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据. 2.LiveDa ...

  2. Jetpack架构组件学习(2)——ViewModel和Livedata使用

    要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 原文地址:Jetpack架构组件学习(2)--ViewModel和Livedata使用 | Stars-One ...

  3. Android Jetpack组件 - ViewModel,LiveData使用以及原理

    本文涉及的源码版本如下: com.android.support:appcompat-v7:27.1.1 android.arch.lifecycle:extensions:1.1.1 android ...

  4. 【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式

    原文作者: Jose Alcérreca 原文地址: ViewModels and LiveData: Patterns + AntiPatterns 译者:秉心说 View 和 ViewModel ...

  5. ViewModel和LiveData问题思考与解答

    嗨,大家好,面试真题系列又来了,今天我们说说MVVM架构里的两大组件:ViewModel和LiveData. 还是老样子,提出问题,做出解答. ViewModel 是什么? ViewModel 为什么 ...

  6. 转 Android Lifecycle、ViewModel和LiveData

    转自:https://www.jianshu.com/p/982545e01d0a 1.概述 在I / O '17的时候,其中一个重要的主题是Architecture Components.这是一个官 ...

  7. ViewModel、LiveData、DataBinding

    ViewModel ViewModel的引入 如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失.例如,应用的某个 Activity 中可能包含用户列表.因配置更改而重新创 ...

  8. Android Jetpack基本架构之ViewModel+LiveData+DataBinding入门

    前提:导入所有依赖,开启DataBinding app的build.gradle android { defaultConfig { ... dataBinding { enabled true } ...

  9. Jetpack 架构组件 LiveData ViewModel MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. Android 架构组件-Lifecycle、LiveData、ViewModel

    Lifecycle Lifecycle组件包括LifecycleOwner.LifecleObserver,能方便监听Activity或者Fragment的生命周期. 步骤: 1.实现Lifecycl ...

随机推荐

  1. UData查询引擎优化-如何让一条SQL性能提升数倍

    1 UData-解决数据使用的最后一公里 1.1 背景 在大数据的范畴,我们经历了数据产业化的历程,从各个生产系统将数据收集起来,经过实时和离线的数据处理最终汇集在一起,成为我们的主题域数据,下一步挖 ...

  2. 你对iframe知道多少

    iframe 嵌套第三方页面出现的问题 我们需要通过一个接口获取被嵌套的地址. 然后将改地址赋值给iframe的src中,代码如下 <template> <div> <i ...

  3. 每日一库:GORM简介

    GORM(Go Object-Relational Mapping)是一个用于Go语言的ORM库,它提供了一种简单.优雅的方式来操作数据库.GORM支持多种数据库,包括MySQL.PostgreSQL ...

  4. vim 从嫌弃到依赖(7)——可视模式

    vim 的可视模式下可以选择一个区域,然后针对区域进行操作.可视模式有点类似于在其他编辑器上使用鼠标选中一块区域然后针对区域进行操作. vim中有3种可视模式,分别用来处理不同范围的文本: 处理字符的 ...

  5. Matplotlib配置图例legend()设置透明和并排显示

    1.多排显示 x=np.linspace(start=-np.pi,stop=np.pi,num=300) plt.style.use('classic') Fig,Axes=plt.subplots ...

  6. 记录一下配置mysql高可用(MHA)的过程及踩到的坑

    记录一下搭建MHA主从的完整过程,同时也把自己部署过程中遇到的坑写进来 参考链接: https://blog.csdn.net/m0_49526543/article/details/10948365 ...

  7. python识别图片中的文本保存到word中

    python可以使用第三方库pytesseract实现图像的文本识别,并将识别的结果保存到word中,代码本生不复杂pytesseract环境有点麻烦这里整理总结一下 一.简介 Tesseract是一 ...

  8. 目录 - JavaScript指南

    目   录 第一章.  JavaScript概述 第二章.  JavaScript语法基础 第三章.  JavaScript编程规范 第四章.  JavaScript工具集合 第五章.  JavaSc ...

  9. 会话跟踪技术之SESSION

    会话跟踪技术之SESSION 一般来说,登录信息既可以存储在session中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同 ...

  10. <semaphore.h> 和 <sys/sem.h> 的区别

    <sys/sem.h>为 XSI(最初是 Unix System V)信号量提供接口. 这些不是基本 POSIX 标准的一部分(它们在 XSI 选项中,主要是为了传统的 Unix 兼容性) ...