LiveData和ViewModel笔记

ViewModel

ViewModel:存放与界面相关的数据。ViewModel的生命周期与Activity的生命周期不一样,在屏幕旋转后Activity重建时数据不会丢失,并且在Activity退出的时候ViewModel能随Activity一起销毁。所以是用来存放数据的不二之选。

在Activity/Fragment中使用加入以下代码和ViewModel绑定

 ViewModelProvider(requireActivity())[MyViewModel::class.java]

在ViewModel页面里面可以写一些数据以及方法,当然搭配LiveData会更好食用。

当然这样是在app被系统杀死之后,ViewModel的数据也会丢失,所以可以在ViewModel的SavedSateHandle里面存放简单的数据,在重新打开app时会读取handle里面是否有存放数据。

AndroidViewModel是ViewModel的一个子类,可以直接调用getApplication(),由此可以访问应用的全局资源。

原理:生命周期自动感知:
onClear回调函数处理资源回收closewithRuntimeException
ViewModel绝对不能引用View、Lifecycle或任何可能包含对Activity上下文的引用的类
有三种创建方法,如下图的vm、vm1、vm2原理都一样:
LiveData和ViewModel笔记_第1张图片
下面是继承了ViewModel的Vmone。
LiveData和ViewModel笔记_第2张图片
viewModelStore只能在activity创建好后才能使用。
最好是给每个Activity和Fragment都创建一个对应的ViewModel。

LiveData

LiveData是可被观察的数据持有类。具有生命周期(Activity/Fragment/Service)感知的(确保active状态下接受data更新)。是一个抽象类。
LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。在逻辑数据处理层LiveData可以更好的感知生命周期,activity和fragment处于活跃状态下都接受到LiveData的响应变化,当它们不处于活跃状态转变成活跃状态时会接收到LiveData的最新响应变化。

在ViewModel页面声明一个liveData,可以赋一个初始值,最好是把它的属性设为私有,然后再写获取和设置它的方法。然后就可以在相应的Activity页面使用它的observe方法去观察,当它的值有变化时就会执行方法体里面相应的动作。

//声明一个liveData
val liveA =mutableLiveData<string>()
//在需要的时候赋值
liveA.value = "some value of liveA"
//在UI中,观察,在active状态下可以感知变化
val liveAobserver = Observer<string>{
value?.let{ 
//do something
}
}
//观察数据的变化  
liveA.observe(vivewLifecycleowner,liveAobserver) 

observe()方法接收了两个参数,第一个LifecycleOwner对象,第二个式一个Observer接口,当观察的数据发生变化时,就会回调到这里,就可以实现相应的逻辑代码了。
要activity实现LiveData最好是继承AppComponentActivity

Transformations.map:做一个数据转换,将实际包含数据的LiveData和仅用观察的LiveData进行转换。因为我们实际得到的数据格式和我们想要的格式不一样,这时候就可以用map()函数来转换成我们需要的数据格式 。

val liveAppleData = MutableLiveData<String>()
val liveMappedData: LiveData<Pair<Int, String>> = 1iveAppleData.map{pair<Int, String>(it.hashcode(), it)

map()接受两个参数:第一个原始的LiveData对象;第二个是一个转换函数,在这里面编写具体的转换逻辑即可。

MediatorLiveData:中介者,媒介,将多个数据源的数据,通过自己定义的规则,得到一个可观测的对象;mediator的liveData可以监听多个数据源的变化,通过addSource后,并响应多个的变化,转化为mediator的变化。,如果inactive下, 多个数据源都变化,则resume后,也只接受最新的变化。如果当前界面不是活跃状态,再切换到活跃状态的时候,只会显示最新获得的数据。

SwitchMap:用于数据源的转化,多数据源的切换和控制。,配合mediator的LiveData使用,根据条件,选择数据源。
当LiveData对象是通过调用另外的方法来获取的,这时候就可以用SwitchMap方法,将这个LiveData对象转换成另一个可观察的LiveData对象。(这段我没有懂,看他的解释是说:将这个 需要获取LiveData对象 的某个值传给 新建的LiveData对象 ,然后观察这个 新的LiveData对象 ,当 新的LiveData对象 的值变化时就去获取这个 需要获取LiveData对象 的值并将它转换成可观察的对象)。
当没有可观测的数据的时候,代码与前面一样,只是将这个空的LiveData对象赋值给自己,重新赋值后LiveData是不会判断内部的数据是否一样,所以任然能促发一次数据变化,这时候还是可以继续调用需要用到的方法。

你可能感兴趣的:(java,android)