Jetpack之LiveData的基本使用

一 前言

大家都知道Rxjava吧,如果想了解Rxjava的使用和基本原理,可以在Rxjava源码解析中查看。谷歌推迟的LiveData和Rxjava类似,也是基于观察者,可以说livedata是轻量级的Rxjava.一开始LiveData并不被大家看好,但是由于谷歌的大力推荐,LiveData也逐渐进入了大家的视野。一般LiveData并不会单独使用,它会和ViewModle一起搭配使用,这次来介绍一下LiveData的使用。

1.什么是LiveData

LiveData如同它的名字一样,是一个可观察的数据持有者,和常规的observable不同,LiveData是具有生命周期感知的,这意味着它能够在Activity、Fragment、Service中正确的处理生命周期。.
在这里插入图片描述
LiveData的数据源一般是ViewModel,也可以是其它可以更新LiveData的组件。当数据更新后,LiveData 就会通知它的所有观察者,比如Activiy。与RxJava的方法不同的是,LiveData并不是通知所有观察者,它 只会通知处于Active状态的观察者,如果一个观察者处于Paused或Destroyed状态,它将不会收到通知。
这对于Activiy和Service特别有用,因为它们可以安全地观察LiveData对象而不用担心内存泄漏的问题。开发者也不需要在onPause或onDestroy方法中解除对LiveData的订阅。还有一点需要注意的是一旦观察者重新恢复Resumed状态,它将会重新收到LiveData的最新数据

public class MainActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MutableLiveData<String> liveData = new MutableLiveData<>();
        liveData.observe(this, new Observer<String>() {
    
       //1
            @Override
            public void onChanged(String s) {
    
    
                Log.d("LiveData:","liveData数据变换成:" + s );
            }
        });

        liveData.setValue("hello liveData");
    }
}

注释1处observe方法有两个参数分别是LifeCycleOwner和observer,第一个参数是MainActiivty,在介绍lifecycle的使用时说过,MainActivity是实现了LifeCycleOwner接口的;第二个参数新建了一个observer,当liveData调用setValue或者postValue改变值时,就会回调onChanged()这个方法,在这个方法里我们可以在这里获取最新的值进行处理。

2.更改LiveData中的数据

如果我们想要在LiveData对象分发给观察者之前对其中存储的值进行更改,可以使用Transformations.map()和Transformations.switchMap(),下面通过简单的例子来讲解它们。

2.1 Transformations.map()

public class MainActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MutableLiveData<String> liveData = new MutableLiveData<>();
        liveData.observe(this, new Observer<String>() {
    
    
            @Override
            public void onChanged(String s) {
    
    
                Log.d("LiveData:","liveData数据变换成:" + s );
            }
        });

        LiveData transformlivedata = Transformations.map(liveData, new Function<String, Object>() {
    
    

            @Override
            public Object apply(String input) {
    
    
                return input + "变换成: "+"transform";
            }
        });
        transformlivedata.observe(this, new Observer() {
    
    
            @Override
            public void onChanged(Object o) {
    
    
                Log.d("LiveDataTransform",o.toString());
            }
        });

        liveData.setValue("hello liveData");
    }
}

2.2 Transformations.switchMap()

如果想要手动控制监听其中一个的数据变化,并能根据需要随时切换监听,这时可以使用Transformations.switchMap(),它和Transformations.map()使用方式类似,只不过switchMap()必须返回一个LiveData对象。

public class MainActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        MutableLiveData<String> liveData = new MutableLiveData<>();
        MutableLiveData<String> liveData1 = new MutableLiveData<>();
        MutableLiveData<Boolean> liveSwitch = new MutableLiveData<Boolean>(); //1

        LiveData transformlivedata = Transformations.switchMap(liveSwitch, new Function<Boolean, LiveData<String>>() {
    
    
            @Override
            public LiveData<String> apply(Boolean input) {
    
    
                if(input){
    
    
                    return liveData;
                }else{
    
    
                    return liveData1;
                }
            }
        });



            transformlivedata.observe(this, new Observer<String>() {
    
    

                @Override
                public void onChanged(String s) {
    
    
                    Log.d("transformlivedata",s);
                }
            });

        liveData.setValue("hello liveData");
        liveData1.setValue("hello liveData1");
        liveSwitch.setValue(false);

   		 }
    }

注释1处新建一个MutableLiveData()来控制切换并赋值给liveDataSwitch,当liveDataSwitch的值为true时返回mutableLiveData1,否则返回mutableLiveData2。注释2处将liveDataSwitch的值更新为faske,这样输出的结果为”Android进阶解密”,达到了切换监听的目的。

2.3 合并多个LiveData数据源

public class MainActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        MutableLiveData<String> liveData = new MutableLiveData<>();
        MutableLiveData<String> liveData1 = new MutableLiveData<>();
        MediatorLiveData mediatorLiveData = new MediatorLiveData<String>();

        mediatorLiveData.addSource(liveData, new Observer<String>() {
    
    
            @Override
            public void onChanged(String s) {
    
    
                Log.d("liveData",s);
            }
        });
        mediatorLiveData.addSource(liveData1, new Observer<String>() {
    
    
            @Override
            public void onChanged(String s) {
    
    
                Log.d("liveData",s);
            }
        });

        mediatorLiveData.observe(this, new Observer() {
    
    
            @Override
            public void onChanged(Object o) {
    
    
                Log.d("mediatorLiveData",o.toString());
            }
        });

        liveData.setValue("liveData1");


    }
}

为了更直观的举例,将LiveData和MediatorLiveData放到了同一个Activity中。通过MediatorLiveData的addSource将两个MutableLiveData合并到一起,这样当任何一个MutableLiveData数据发生变化时,MediatorLiveData都可以感知到。

猜你喜欢

转载自blog.csdn.net/qq_39431405/article/details/117824370