• LiveData简单使用


    1.LiveData是基于观察者模式,可以用于处理消息的订阅分发的组件。

     LiveData组件有以下特性:
        1) 可以感知Activity、Fragment生命周期变化,因为他把自己注册成LifecycleObserver。
        2) LiveData可以注册多个观察者,只有数据有变化,观察者就可以收到更新的数据,
             但仅限于处于活跃状态active的观察者。
        3) 在onDestroy时,LiveData会自动回收注册的观察者,不会导致Activity内存泄漏。

    2.简单使用介绍:

        1)创建LiveData对象,并注册观察者。

    1. TextView ageTv = findViewById(R.id.age);
    2. TextView nameTv = findViewById(R.id.name);
    3. MutableLiveData<Person> liveData = new MutableLiveData();
    4. liveData.observe(this, new Observer<Person>() {
    5. @Override
    6. public void onChanged(Person person) {
    7. ageTv.setText(String.valueOf(person.age));
    8. nameTv.setText(person.name);
    9. }
    10. });

      2)通过setValue改变数据:这时会调用上面的onChanged()方法,从而实现了数据驱动UI。后面会进行源码分析他的实现逻辑。

    1. findViewById(R.id.set_value).setOnClickListener(v -> {
    2. Person person = new Person();
    3. person.age = this.age++;
    4. person.name = "xiaohua";
    5. liveData.setValue(person);
    6. });

    3)子线程中数据变化,得需要调用postValue,发送到主线程执行,因为在子线程是无法更新UI的。

    1. findViewById(R.id.post_value).setOnClickListener(v -> {
    2. new Thread(){
    3. @Override
    4. public void run() {
    5. super.run();
    6. Person person = new Person();
    7. person.age = MainActivity.this.age++;
    8. person.name = "xiaohua";
    9. liveData.postValue(person);
    10. }
    11. }.start();
    12. });
    1. protected void postValue(T value) {
    2. boolean postTask;
    3. synchronized (mDataLock) {
    4. postTask = mPendingData == NOT_SET;
    5. mPendingData = value;
    6. }
    7. if (!postTask) {
    8. return;
    9. }
    10. ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    11. }
    1. private final Runnable mPostValueRunnable = new Runnable() {
    2. @SuppressWarnings("unchecked")
    3. @Override
    4. public void run() {
    5. Object newValue;
    6. synchronized (mDataLock) {
    7. newValue = mPendingData;
    8. mPendingData = NOT_SET;
    9. }
    10. setValue((T) newValue);
    11. }
    12. };

    如果在子线程冲调用setValue会抛出下面的异常:

    1. java.lang.IllegalStateException: Cannot invoke setValue on a background thread
    2. at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:487)
    3. at androidx.lifecycle.LiveData.setValue(LiveData.java:306)
    4. at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
    5. at com.example.jetpack.MainActivity$2.run(MainActivity.java:52)

    4)只要数据源发生了变化,调用setValue或postValue,在LiveData注册的观察者
          就会回调onChanged方法,在这个方法中,可以接收到数据的更新。

  • 相关阅读:
    Java“牵手”淘宝商品详情数据,淘宝商品详情接口,淘宝API接口申请指南介绍
    STM32之HAL开发——CubeMX配置串行Flash文件系统
    mysql面试题26:MySQL中什么是MVCC,它的底层原理是什么
    【python小脚本】监听日志文件异常数据发送告警短信
    OVS-DPDK/虚拟化学习
    嵌入式系统中C++内存管理基本方法
    ChatGPT第五讲
    SpringBoot 整合mybatis,mybatis-plus
    BFSの笔记
    亚商投资顾问 早餐FM/1130物流需求延续逐步恢复态势
  • 原文地址:https://blog.csdn.net/niuyongzhi/article/details/133352671