LiveData
一般的LiveData配合ViewMode使用
LiveData是一个可以观察的,数据持有者。也就是说LiveData是观察生命周期的
优势
- 确保UI的显示状态与数据一致:因为是使用了观察者模式
- 没有内存泄漏:与生命周期相关,在UI执行了destroy的时候,观察者自动清除
- 不会因为活动停止而崩溃:如果观察者在后台堆栈中活动,就不会接受到LiveData事件
- 不再手动处理生命周期:观察者模式
- 保持数据最新:观察者页面进入前台的时候,会接收最新的数据
- configuration改变,会立即更新数据
- 共享资源:一个系统服务,使用单例模式+LiveData扩展它,在其他程序中共享这个服务
基本使用
基本参与者就是ViewModel,UI,LiveData,以及LifecycleOwner,观察者
-
ViewMode与之前不一样,之前ViewModel内部是Model,现在是LiveData,不过指定了LiveData关联的Model
public class LiveDataModel extends ViewModel { private MutableLiveData<User> user; /** * 提供一个获取LiveData的方法 * @return */ public MutableLiveData<User> getUser() { if (user == null) { user = new MutableLiveData<User>(); } return user; }
}
-
LifecycleOwner对象,一般的继承AppCompatActivity的Activity就是LifecycleOwner子类
-
UI页面通过ViewModelProviders获取ViewModel,然后通过ViewModel获取到包含的LiveData,将LiveData添加到页面的生命周期观察列表中
// 获取ViewModel LiveDataModel model = ViewModelProviders.of(this).get(LiveDataModel.class); // 获取到LiveData添加到生命周期观察列表中,只在UI启动的时候执行一次 model.getUser().observe(this, new Observer<User>() { // 数据改变的时候回调 @Override public void onChanged(@Nullable User user) { } }); // 更新数据 // model.getUser().postValue(new User("lvInName", "lvOutName")); model.getUser().setValue(new User("lvInName", "lvOutName"));
使用postValue和setValue都可以,区别在于:
- set这个方法必须在主线程中调用
- 如果要在子线程中调用需要使用post方法
基本参与者和关系
在UI中,为LiveData添加观察者,UI就是观察者持有者。
LiveData的数据转换
将拿到的元数据进行转换要在LiveData中进行,可以参考:https://www.jianshu.com/p/44f67f4fa760
使用时的小坑
liveData.observe(this, Observer {....}
内部的onchange方法,触发方法是livedata设置新的value。如果只是单纯的获取到value,然后修改某一个属性值的话,不会触发
由此又想到dataBinding,测试,dataBinding的刷新也是重新赋值刷新,而不能是获取值后修改某个属性,这样是不会触发刷新的