Jetpack 架构组件:LiveData

简介

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如Activity/Fragment)的生命周期。这种感知能力可确保 LiveData仅更新处于活跃生命周期状态的应用组件观察者。

优势

  • UI和实时数据保持一致

LiveData 遵循观察者模式。当数据更新后,LiveData就会通知它的所有观察者;与RxJava的方法不同的是,LiveData并不是通知所有观察者,它只会通知处于活跃状态(Activity/Fragment 处于STARTED和RESUMED 状态)的观察者。

  • 不会发生内存泄漏

观察者被绑定到组件的生命周期上,当被绑定的组件销毁(destory)时,观察者会立刻自动清理自身的数据。

  • 不需要手动解除观察

开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。

  • 解决Configuration Change问题

在屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据。

用法

LiveData 和ViewModel 搭配使用

  • 创建LiveData实例,指定源数据类型

LiveData是一个数据的包装。具体的包装对象可以是任何数据,包括集合。LiveData是一个抽象类,它的最简单的实现类为MutableLiveData。

public class ExViewModel extends ViewModel {
   
   

    private MutableLiveData<Integer>  num;

    public MutableLiveData<Integer> getNum() {
   
   
        if (num == null) {
   
   
            num = new MutableLiveData<>();
        }
        return num;
    }
}
  • 观察LiveData中的数据

创建Observer实例,实现onChanged()方法,用于接收源数据变化并刷新UI。

num.observe(this, new Observer<Integer>() {
   
   
            @Override
            public void onChanged(Integer integer) {
   
   
                tv_num.setText(String.valueOf(integer));
            }
 });

通过LiveData.observe()方法对LivaData所包装的数据进行观察。在onChanged方法就会收到我们修改之后的数据,我们就可以对UI进行更改了。

  • 使用LiveData 更新数据
// 获取ViewModel 对象
ExViewModel model = new ViewModelProvider(this).get(ExViewModel.class);
// 获取LiveData 对象
MutableLiveData<Integer> num = model.getNum();
        
btn.setOnClickListener(new View.OnClickListener() {
   
   
            @Override
            public void onClick(View v) {
   
   
                i++;
                num.setValue(i);
            }
        });

通过LiveData.postValue/LiveData.setValue()方法修改数据。注意:setValue()方法必须在主线程使用,如果是在工作线程中更新LiveData,则可以使用postValue()方法。

效果:
在这里插入图片描述

转换LiveData 数据

如果想要在LiveData对象分发给观察者之前对其中存储的值进行更改,可以使用Transformations.map()和Transformations.switchMap()。

  • Transformations.map
MutableLiveData<Integer> num=new MutableLiveData<>();
  
  LiveData<String>  info=Transformations.map(num, new Function<Integer, String>() {
   
   
            @Override
            public String apply(Integer input) {
   
   

                return input+"次点击";
            }
        });
        
    info.observe(this, new Observer<String>() {
   
   
            @Override
            public void onChanged(String s) {
   
   
                Log.e(TAG,"--->"+s);
            }
        }); 
    
    num.setValue(1);
    
// 执行结果:
ExJetPackActivity: --->1次点击

通过Transformations.map()方法对源数据Integer 类型LiveData,修改成String 类型LiveData。

  • Transformations.switchMap
    如果想要根据某个值 切换观察不同LiveData数据,则可以使用Transformations.switchMap()方法。
MutableLiveData<String> work=new MutableLiveData<>();
        work.setValue("加班");
        
        MutableLiveData<String> rest=new MutableLiveData<>();
        rest.setValue("双休");

        MutableLiveData<Boolean> conditions=new MutableLiveData<>();
        conditions.setValue(true);

        LiveData<String> result=Transformations.switchMap(conditions, new Function<Boolean, LiveData<String>>(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值