Android Jetpack-LiveData使用

161 阅读2分钟

这是我参与 8 月更文挑战的第 16 天,活动详情查看: 8月更文挑战

简介

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

使用

导入依赖包

在项目的根build中添加

allprojects {
    repositories {
        google()

    }
}

在app级build目录下添加如下依赖

//livedata androidx
implementation "androidx.lifecycle:lifecycle-livedata:2.2.0"

创建LiveData对象

public class TestViewModel extends ViewModel {
    private MutableLiveData<String> currentName;
    public TestViewModel(){
        currentName = new MutableLiveData<String>();
    }
    
    public MutableLiveData<String> getCurrentName() {
        return currentName;
    }
}

观察LiveData对象

Activity或者Fragment中进行观察

TestViewModel viewModel = new ViewModelProvider(this).get(TestViewModel.class);
viewModel.getCurrentName().observe(this, new Observer<String>() {
    @Override
    public void onChanged(String currentName) {
        //更新UI或者实现对应的逻辑
    }
});

通过这种方式观察的LiveData对象仅在页面活跃的时候才会收到更新的消息, 如果有需求再界面不活跃的时候也需要收到消息, 可以使用observeForever方法

viewModel.getCurrentName().observeForever(observer);
Observer observer = new Observer<String>() {
    @Override
    public void onChanged(String currentName) {
        //更新UI或者实现对应的逻辑
    }
};

通过这种方式观察的LiveData对象会一直存在, 为了防止内存泄漏, 一定要在onDestroy方法中移除对应的监听

@Override
protected void onDestroy() {
    super.onDestroy();
    viewModel.getCurrentName().removeObserver(observer);
}

更新LiveData对象

设置完观察者后, 可以对LiveData对象进行更新, 可以在UI中更新,也可以在ViewModel中更新, 只要可以拿到LiveData对象都可以对其更新

  • 在UI中更新 可以是当用户点击的时候进行更新
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        String anotherName = "Your Name";
        viewModel.getCurrentName().setValue(anotherName);
    }
});
  • 在ViewModel中更新
public void getUser(){
    //对应的逻辑, 并更新
    currentName.setValue("");
}

注意: setValue方法仅能在主线程中更新LiveData对象, 如果想在子线程中更新LiveData对象, 需要用到postValue

  • 在子线程中更新
public void getUser(){
    //对应的逻辑, 并更新
    currentName.postValue("");
}