欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android架构组件LiveData使用详解,

来源: 开发者 投稿于  被查看 17772 次 评论:198

Android架构组件LiveData使用详解,


目录
  • LiveData
  • 应用架构中的LiveData
  • 扩展LiveData
  • LiveData使用总结
    • LiveData的优点
  • LiveData源码分析:

    LiveData

    LiveData是基于观察者模式创建的,其中,LiveData是被观察者,观察者通过注册方法,监听被观察者的数据变化。LiveData在数据发生变化的时候,会通知观察者。

    LiveData是一个容器,存放数据的容器,它的数据变化可以被监听,也就是LiveData是一个被观察者,如下,创建了一个存放String的数据容器currentName:

    public class NameViewModel extends ViewModel {
    // Create a LiveData with a String
    private MutableLiveData<String> currentName;
       public MutableLiveData<String> getCurrentName() {
           if (currentName == null) {
               currentName = new MutableLiveData<String>();
           }
           return currentName;
       }
    // Rest of the ViewModel...
    }

    监听LiveData数据变化,为LiveData添加观察者,如下,添加一个nameObserver,监听LiveData的数据变化,当LiveData的数据发生变化的的时候,onChanged方法会被回调,从而更新UI。

    public class NameActivity extends AppCompatActivity {
       private NameViewModel model;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           // Other code to setup the activity...
           // Get the ViewModel.
           model = new ViewModelProvider(this).get(NameViewModel.class);
           // Create the observer which updates the UI.
           final Observer<String> nameObserver = new Observer<String>() {
               @Override
               public void onChanged(@Nullable final String newName) {
                   // Update the UI, in this case, a TextView.
                   nameTextView.setText(newName);
               }
           };
           // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
           model.getCurrentName().observe(this, nameObserver);
       }
    }

    更新LiveData数据的方式,使用setValue和postValue两个方法

    LiveData发布修改有setValue和postValue两种方式,其中setValue只能在主线程调用,postValue则没有这个限制

    button.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
           String anotherName = "John Doe";
           model.getCurrentName().setValue(anotherName);
       }
    });

    应用架构中的LiveData

    LiveData 具有生命周期感知能力,遵循 activity 和 fragment 等实体的生命周期。您可以使用 LiveData 在这些生命周期所有者和生命周期不同的其他对象(例如 ViewModel 对象)之间传递数据。ViewModel 的主要责任是加载和管理与界面相关的数据,因此非常适合作为用于保留 LiveData 对象的备选方法。您可以在 ViewModel 中创建 LiveData 对象,然后使用这些对象向界面层公开状态。

     activity 和 fragment 不应保留 LiveData 实例,因为它们的用途是显示数据,而不是保持状态。此外,如果 activity 和 fragment 无需保留数据,还可以简化单元测试的编写。

    扩展LiveData

    如果观察者的生命周期处于 STARTED 或 RESUMED 状态,LiveData 会认为该观察者处于活跃状态。以下示例代码说明了如何扩展 LiveData 类

    public class StockLiveData extends LiveData<BigDecimal> {
        private StockManager stockManager;
    
    
        private SimplePriceListener listener = new SimplePriceListener() {
            @Override
            public void onPriceChanged(BigDecimal price) {
                setValue(price);
            }
        };
    
    
        public StockLiveData(String symbol) {
            stockManager = new StockManager(symbol);
        }
    
    
        @Override
        protected void onActive() {
            stockManager.requestPriceUpdates(listener);
        }
    
    
        @Override
        protected void onInactive() {
            stockManager.removeUpdates(listener);
        }
    }

    当LiveData对象具有活跃观察者时, 会调用 onActive() 方法。这意味着,您需要从此方法开始观察股价更新。

    当 LiveData 对象没有任何活跃观察者时,会调用 onInactive() 方法。由于没有观察者在监听,因此没有理由与 StockManager 服务保持连接。

    setValue(T) 方法将更新 LiveData 实例的值,并将更改告知活跃观察者。

    LiveData使用总结

    • 创建LiveData,使用viewModel类来包含

    • 创建观察者Observer

    • 调用LiveData的observe方法将LiveData以及Observer建立起发布-订阅关系

    • 在适当的时机调用LiveData的setValue或者postValue发布新数据通知观察者

    LiveData的优点

    • 能够确保数据和UI统一

      LiveData采用了观察者模式,当数据发生变化时,主动通知被观察者。

    • 解决内存泄露问题

      由于LiveData会在Activity/Fragment等具有生命周期的lifecycleOwner组件调用onDestory的时候自动解绑,所以解决了可能存在的内存泄漏问题。之前我们为了避免这个问题,一般有注册绑定的地方都要解绑(即注册跟解绑要成对出现),而LiveData利用生命周期感知功能解决了这一问题,可以实现只需关心注册,而解绑会根据生命周期自动进行的功能。

    • 当Activity停止时不会引起崩溃

      当Activity组件处于inactive非活动状态时,它不会收到LiveData数据变化的通知。

    • 不需要手动处理生命周期的变化

      观察者并不需要手动处理生命周期变化对自身的逻辑的影响,只需要关心如何处理获取到的数据。LiveData能够感知Activity/Fragment等组件的生命周期变化,所以就完全不需要在代码中告诉LiveData组件的生命周期状态,当数据发生变化时,只在生命周期处于active下通知观察者,而在inactive下,不会通知观察者。

    • 确保总能获取到最新的数据

      什么意思呢?第一种情况,当观察者处于active活动状态。LiveData基于观察者模式,所以当数据发生变化,观察者能够马上获取到最新变化;第二种情况,当观察者处于inactive非活动状态。LiveData只能生命周期active下发送数据给观察者。举个例子,当Activity处于后台(inactive)时,LiveData接收到了新的数据,但这时候LiveData并不会通知该Activity,但是当该Activity重新返回前台(active)时会继续接收到最新的数据。一句话概括,LiveData是粘性的

    • configuration changes时,不需要额外的处理来保存数据我们知道,当你把数据存储在组件中时,当configuration change(比如语言、屏幕方向变化)时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。当我们采用LiveData保存数据时,因为数据和组件分离了。当组件被recreate,数据还是存在LiveData中,并不会被销毁。

    • 资源共享

      通过继承LiveData类,然后将该类定义成单例模式,在该类封装监听一些系统属性变化,然后通知LiveData的观察者。

    LiveData源码分析:

    public interface Observer<T> {
      /**
       * Called when the data is changed.
       * @param t  The new data
       */
      void onChanged(@Nullable T t);
    }
    // 注意,他是 abstract class
    public abstract class LiveData<T> {
      // 只有 onStart 后,对数据的修改才会触发 observer.onChanged()
      public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {}
      // 无论何时,只要数据发生改变,就会触发 observer.onChanged()
      public void observeForever(@NonNull Observer<T> observer) {}
    }

    到此这篇关于Android架构组件LiveData使用详解的文章就介绍到这了,更多相关Android架构组件LiveData内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Android Jetpack架构组件Lifecycle详解
    • Android Jetpack架构组件 ViewModel详解
    • Android 生命周期架构组件使用方法
    • Android架构组件Room的使用详解
    • Android架构组件Room指南
    • Android-ViewModel和LiveData使用详解
    • Android LiveData使用需要注意的地方
    • Android mvvm之LiveData原理案例详解
    • Android 基于MediatorLiveData实现红点的统一管理
    • 详解Android JetPack之LiveData的工作原理

    用户评论