1.框架
位于最上层的Activity/Fragment是和用户最相关的界面部分,这部分是由一个或者多个视图组成的,它与viewmodel直接交互,而不是直接和本地或者远程数据存储交互
ViewModel
是 Android Jetpack 中的一个组件,它用于在配置更改(如屏幕旋转)时存储和管理与 UI 相关的数据。它确保在 Activity
或 Fragment
的生命周期内,即使这些组件被销毁和重新创建,数据也会保留下来。
以下是为什么 ViewModel
不会随着 Activity
或 Fragment
的销毁而发生数据丢失的详细解释,结合源码和概念:
-
生命周期绑定:
ViewModel
的生命周期不直接绑定到Activity
或Fragment
,而是绑定到与这些组件关联的LifecycleOwner
(通常是Activity
或Fragment
本身)。- 当
Activity
或Fragment
被销毁时,如果它们是ViewModel
的唯一所有者,ViewModel
并不会被立即销毁。相反,它会被保留在内存中,等待其所有者重新创建。
-
ViewModelStore:
- 每个
Activity
和Fragment
都有一个与之关联的ViewModelStore
。这个ViewModelStore
负责存储和管理与该Activity
或Fragment
关联的ViewModel
实例。 - 当
Activity
或Fragment
被销毁时,它们的ViewModelStore
不会被立即销毁。相反,它会被保留在内存中,直到与ViewModelStore
关联的LifecycleOwner
(即Activity
或Fragment
)被完全销毁(例如,在Activity
的onDestroy()
方法被调用后)。
- 每个
-
ViewModelProvider:
ViewModelProvider
是一个工厂类,用于创建和管理ViewModel
实例。- 当我们调用
ViewModelProvider.get(LifecycleOwner, Class<T>)
方法时,它会首先检查ViewModelStore
中是否已存在与给定Class<T>
对应的ViewModel
实例。如果存在,则返回该实例;否则,创建一个新的实例并将其存储在ViewModelStore
中。
-
源码分析:
- 在
ViewModelProvider
的get
方法中,你会看到它首先尝试从ViewModelStore
中获取ViewModel
。 - 如果
ViewModel
不存在,它将使用默认的ViewModelFactory
(或提供的自定义工厂)来创建一个新的ViewModel
实例。 - 创建的
ViewModel
实例随后被存储在ViewModelStore
中,以便在需要时重新获取。
- 在
-
Demo 说明:
- 假设你有一个
Activity
,其中包含一个ViewModel
来存储用户数据。 - 当用户旋转屏幕时,
Activity
会被销毁并重新创建。但是,由于ViewModel
与Activity
的ViewModelStore
关联,并且ViewModelStore
在Activity
被销毁时不会被销毁,因此ViewModel
中的数据会保留下来。 - 当新的
Activity
实例被创建时,你可以通过ViewModelProvider
重新获取ViewModel
实例,并访问其中存储的数据。
- 假设你有一个
综上所述,ViewModel
之所以不会随着 Activity
或 Fragment
的销毁而发生数据丢失,是因为它与这些组件的生命周期不同步,并且它的数据被存储在与之关联的 ViewModelStore
中,该 ViewModelStore
在 Activity
或 Fragment
被销毁时不会被销毁。
1.livedata,MVVM相关
lifecycler
1.1livedata先setValue,再观察数据,也可以收到数据,粘性数据
粘性危害,只想要订阅之后发生改变的数据,不关心订阅之前的旧数据
1.1.0原因
mVersion (被观察者的版本号)每次更新数据时候++,更新过一次,则mVersion=0
mLastVersion(观察者的版本号) = -1;
然后会将mVersion赋值给mLastVersion,保持版本号一致,同步更新数据
通过版本防止数据分发错乱
1.1.1如何解除粘性
使用反射 ,让mlastversion = mversion,即mlastversion++,走return方法
1.2源码
第一个参数是感知生命周期,第二个参数是观察者