转载请注明链接: https://blog.csdn.net/feather_wch/article/details/88648559
LiveData基本教程
版本号:2019-04-12(11:30)
文章目录
简介
1、LiveData的简介
LiveData
是一种类,持有可被观察的数据
。LiveData
是一种可感知生命周期的组件
,意味着该组件重视其他app组件的生命周期
,如Activity、Fragment、Service
- 该组件能确保,仅仅在
Activity\Fragment\Service等组件
都处于活跃的生命周期状态的时候,才去更新app组件。
2、LiveData只有当观察者的生命周期处于活跃状态
时才会去通知观察者。
- 实现了
Observer类
的观察者,可以注册监听LiveData
- 活跃状态就是指处于
STARTED或者RESUMED
状态- 处于非活跃的观察者,LiveData不会去通知这些观察者
3、可以注册一种观察者, 该观察者与LifecycleOwner
对象(如:Activity、Fragment)相关联。
- 在对应的
Lifecycle Object
处于DESTORYED
状态时,会自动解除LiveData和该观察者的注册关系
4、在Activity、Fragment中这种自动解除注册的特性非常有用
- Activity、Fragment不用担心会出现
内存泄露
- 在
Activity、Fragment
销毁时,LiveData会自动解除其注册关系
优势
5、LiveData能确保UI和数据状态相符
- 因为是观察者模式,LiveData会在生命周期状态改变时,通知观察者
- 可以在
观察者对象
中进行UI的更新操作
6、LiveData没有内存泄露
- 观察者和
Lifecycle对象
绑定,能在销毁时自动解除注册
7、LiveData不会给已经停止的Activity发送事件
- 如果观察者处于非活跃状态,
LiveData
不会再发送任何事件给这些Observer对象
8、LiveData能确保不再需要手工对生命周期进行处理
- UI组件仅仅需要对相关数据进行观察
- LiveData自动处理生命周期状态改变后,需要处理的代码。
9、LiveData能保证数据最新
- 一个
非活跃的组件
进入到活跃状态
后,会立即获取到最新的数据- 不用担心数据问题
10、LiveData在横竖屏切换等Configuration改变时,也能保证获取到最新数据
- 例如
Acitivty、Fragment
因为屏幕选装
导致重建
, 能立即接收到最新的数据
11、LiveData能资源共享
- 如果将
LiveData对象
扩充,用单例模式
将系统服务进行包裹
。这些服务就可以在app中共享。- 只需要
LiveData和系统服务
connect,其他观察者
只需要监视LiveData
就能获取到这些资源
使用LiveData
1、LiveData的使用遵循下面三个步骤
- 创建
LiveData的实例
,并持有具有类型的数据- 创建
Observer对象
,该对象具有onChanged()
方法,在LiveData的数据改变时
,会调用onChanged()方法,进行相应的处理工作
。可以将Observer
放置到activity、fragment
中- 利用
observe()方法
将Observer
和LiveData
联系起来。
* observe()接收一个LifecycleOwner对象
* 可以使用observeForeve(Observer)
注册一个没使用LifecycleOwner
的Observer
,这种场景中,该Observer会认为是一直存活的。
* 使用removeObserver(Observer)
可以移除这些观察者
创建LiveData对象
2、创建LiveData对象
LiveData
能用来包裹所有数据,包括实现了Collections
的对象,例如ListLiveData
通常存储在ViewModel
之中, 并通过get方法
来获取
public class UserViewModel extends ViewModel {
private MutableLiveData<String> mName;
private MutableLiveData<Integer> mAge;
public MutableLiveData<String> getName() {
if(mName == null){
mName = new MutableLiveData<>();
}
return mName;
}
public MutableLiveData<Integer> getAge() {
if(mAge == null){
mAge = new MutableLiveData<>();
}
return mAge;
}
}
3、为什么将LiveData放置到ViewModel中,而不放到activity或者fragment中?
- 避免fragment和activity的代码臃肿
- 将
LiveData
和特定的activity/fragment解耦,能够在configuration改变的时候,LiveData依然存活。
观察LiveData对象
4、在App组件的哪个生命周期适合观察LiveData对象?为什么?
- app组件的
onCreate()
方法- 不适合在
onResume()
等方法中,可能会调用多次- 能确保组件能尽可能快的展示出数据。只要app组件处于启动状态(STARTED)就会立即接收到
LiveData对象
中的数据—前提是已经监听了LiveData