Android LiveData使用文档

💨💨Git源码地址

使用LiveData对象

请按照以下步骤使用 [LiveData]对象:

  1. 创建 LiveData 的实例以存储某种类型的数据。这通常在 [ViewModel] 类中完成。
  2. 创建可定义 [onChanged()] 方法的 [Observer]对象,该方法可以控制当 LiveData 对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中创建 Observer 对象。
  3. 使用 [observe()] 方法将 Observer 对象附加到 LiveData 对象。observe() 方法会采用 [LifecycleOwner](htt对象。这样会使 Observer 对象订阅 LiveData 对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中附加 Observer 对象。

当您更新存储在 LiveData 对象中的值时,它会触发所有已注册的观察者(只要附加的 LifecycleOwner 处于活跃状态)。

LiveData 允许界面控制器观察者订阅更新。当 LiveData 对象存储的数据发生更改时,界面会自动更新以做出响应。

创建 LiveData 对象

LiveData 是一种可用于任何数据的封装容器,其中包括可实现 Collections 的对象,如 List。[LiveData] 对象通常存储在 [ViewModel] 对象中,并可通过 getter 方法进行访问,如以下示例中所示:

public class ViewModelWithLiveData extends ViewModel {
    private MutableLiveData<Integer> LikedNumber;

    public MutableLiveData<Integer> getLikedNumber() {
        if (LikedNumber == null) {
            LikedNumber = new MutableLiveData<>();
            LikedNumber.setValue(0);
        }
        return LikedNumber;
    }

    public void add(int n) {
        LikedNumber.setValue(LikedNumber.getValue() + n);
    }
}
观察 LiveData 对象

在大多数情况下,应用组件的 onCreate() 方法是开始观察 [LiveData] 对象的正确着手点,原因如下:

  • 确保系统不会从 Activity 或 Fragment 的 onResume() 方法进行冗余调用。
  • 确保 Activity 或 Fragment 变为活跃状态后具有可以立即显示的数据。一旦应用组件处于 [STARTED] 状态,就会从它正在观察的 LiveData 对象接收最新值。只有在设置了要观察的 LiveData 对象时,才会发生这种情况。

通常,LiveData 仅在数据发生更改时才发送更新,并且仅发送给活跃观察者。此行为的一种例外情况是,观察者从非活跃状态更改为活跃状态时也会收到更新。此外,如果观察者第二次从非活跃状态更改为活跃状态,则只有在自上次变为活跃状态以来值发生了更改时,它才会收到更新。

public class MainActivity extends AppCompatActivity {
    ViewModelWithLiveData viewModelWithLiveData;
    TextView textView;
    ImageButton imageButtonRun, imageButtonStop;

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

        textView = findViewById(R.id.textView);
        imageButtonRun = findViewById(R.id.imageButton3);
        imageButtonStop = findViewById(R.id.imageButton4);

//        viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData.class); 老方法
        viewModelWithLiveData = new ViewModelProvider(this).get(ViewModelWithLiveData.class);
        //观察对象
        viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(integer));
            }
        });
		//更新对象
        imageButtonRun.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelWithLiveData.add(1);
            }
        });
        //更新对象
        imageButtonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelWithLiveData.add(-1);
            }
        });
    }
}

在传递 nameObserver 参数的情况下调用 [observe()] 后,系统会立即调用 [onChanged()],从而提供 mCurrentName 中存储的最新值。如果 LiveData 对象尚未在 mCurrentName 中设置值,则不会调用 onChanged()

也就是利用onChanged()来操作数据变化之后的操作

更新 LiveData 对象

LiveData 没有公开可用的方法来更新存储的数据。[MutableLiveData] 类将公开 [setValue(T)] 和 [postValue(T)] 方法,如果您需要修改存储在 [LiveData] 对象中的值,则必须使用这些方法。通常情况下会在 [ViewModel] 中使用 MutableLiveData,然后 ViewModel 只会向观察者公开不可变的 LiveData 对象。

设置观察者关系后,您可以更新 LiveData 对象的值(如以下示例中所示),这样当用户点按某个按钮时会触发所有观察者:

imageButtonRun.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewModelWithLiveData.add(1); //添加操作
    }
});
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪随安

朝看天色暮看云行也思君坐也思君

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值