天天看点

Android LiveData使用Jetpack LiveData

文章目录

  • Jetpack LiveData
    • 概述
    • API说明
    • LiveData使用
      • 基本使用
      • Transformations#map() 数据修改
      • Transformations#switchMap() 数据切换
      • MediatorLiveData#addSource() 观察多个数据

Jetpack LiveData

概述

LiveData是一种可观察到数据存储器类,LiveData具有感知生命周期的能力,确保LiveData仅更新处于活跃生命周期状态的观察者。

优点:

  • 确保界面符合数据状态,当生命周期状态变化时,LiveData通知Observer,可以在observer中更新界面。观察者可以在生命周期状态更改时刷新界面,而不是在每次数据变化时刷新界面。
  • 不会发生内存泄漏,observer会在LifecycleOwner状态变为DESTROYED后自动remove。
  • 不会因 Activity 停止而导致崩溃,如果LifecycleOwner生命周期处于非活跃状态,则它不会接收任何 LiveData事件。
  • 不需要手动解除观察,开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。
  • 数据始终保持最新状态,数据更新时 若LifecycleOwner为非活跃状态,那么会在变为活跃时接收最新数据。例如,曾经在后台的 Activity 会在返回前台后,observer立即接收最新的数据。

API说明

setValue() 主线程更新数据
postValue() 子线程更新数据
observe() 添加观察者
onChanged() 接收数据
           

LiveData使用

基本使用

public class MainActivity extends AppCompatActivity {
    private final String TAG = "TAG";

    private MutableLiveData<String> liveData;

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

        liveData = new MutableLiveData<>();
        liveData.observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
                Log.e(TAG, "onChanged: " + s);
            }
        });

        Log.e(TAG, "onCreate()");
        liveData.setValue("onCreate"); //非活动状态,不会调用onChanged()
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart()");
        liveData.setValue("onStart"); //活动状态,会调用onChanged()
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume");
        liveData.setValue("onResume"); //活动状态,会调用onChanged()
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "onPause()");
        liveData.setValue("onPause"); //活动状态,会调用onChanged()
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop()");
        liveData.setValue("onStop"); //非活动状态,不会调用onChanged()
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy()");
        liveData.setValue("onDestroy"); //非活动状态,不会调用onChanged()
    }
}
           

Transformations#map() 数据修改

MutableLiveData<String> liveData = new MutableLiveData<>();
LiveData<String> liveDataMap = Transformations.map(liveData, new Function<String, String>() {
    @Override
    public String apply(String input) {
        String str = input + " LiveData";
        Log.e(TAG, "apply: " + str);
        return str;
    }
});

liveDataMap.observe(this, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        Log.e(TAG, "onChanged: " + s);
    }
});

liveData.setValue("hello");
           
apply: hello LiveData
onChanged: hello LiveData
           

Transformations#switchMap() 数据切换

根据判断条件切换不同的LiveData

MutableLiveData<String> liveData1 = new MutableLiveData<>();
MutableLiveData<String> liveData2 = new MutableLiveData<>();
//切换LiveData的条件
MutableLiveData<Boolean> switchLiveData = new MutableLiveData<>();

LiveData<String> resultLiveData = Transformations.switchMap(switchLiveData, new Function<Boolean, LiveData<String>>() {
    @Override
    public LiveData<String> apply(Boolean input) {
        //判断使用哪一个LiveData
        if (input) {
            return liveData1;
        } else {
            return liveData2;
        }
    }
});

resultLiveData.observe(this, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        Log.e(TAG, "onChanged: " + s);
    }
});

switchLiveData.postValue(true);
liveData1.postValue("ABC");
liveData2.postValue("123");
           
onChanged: ABC
           

MediatorLiveData#addSource() 观察多个数据

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

mediatorLiveData.addSource(liveData1, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        Log.e(TAG, "onChanged liveData1: " + s);
        mediatorLiveData.setValue(s);
    }
});

mediatorLiveData.addSource(liveData2, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        Log.e(TAG, "onChanged liveData2: " + s);
        mediatorLiveData.setValue(s);
    }
});

mediatorLiveData.observe(this, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        Log.e(TAG, "onChanged: " + s);
    }
});

liveData1.setValue("ABC");
//liveData2.setValue("123");
           
onChanged liveData1: ABC
onChanged: ABC
           

继续阅读