Jetpack-LiveData解析

目录

1 概念

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

2 特点

如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。

  1. 确保界面符合数据状态
    LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面

  2. 不会发生内存泄漏
    观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理

  3. 不会因 Activity 停止而导致崩溃
    如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件

  4. 不再需要手动处理生命周期
    界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。

  5. 数据始终保持最新状态
    如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。

  6. 适当的配置更改
    如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment,它会立即接收最新的可用数据。

  7. 共享资源
    可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用*享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象

3.使用

def lifecycle_version = "2.3.1"
 // LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
public class MyViewModel extends ViewModel {
    MutableLiveData<Integer> liveData;
    public MutableLiveData getLiveData() {
        if (liveData==null){
            liveData  = new MutableLiveData<>();
            liveData.setValue(0);
        }
        return liveData;
    }
    public void setLiveData(int value) {
        if (liveData==null){
            liveData  = new MutableLiveData<>();
            liveData.setValue(0);
        } else{
            liveData.setValue(liveData.getValue()+value);
        }
    }
}

 myViewModel = new ViewModelProvider(this).get(MyViewModel.class);

 myViewModel.getLiveData().observe(this, new Observer<Integer>() {
     @Override
     public void onChanged(Integer o) {
         mResult.setText(o+"");
     }
 });
 
//默认设置
 mResult.setText( myViewModel.getLiveData().getValue()+"");
 mZan.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         myViewModel.setLiveData(1);
     }
 });
上一篇:一个即将30岁Android程序员的自诉,在内卷的大环境之下迷惘的大龄程序员该如何破局?


下一篇:什么是 Android Jetpack?