Jetpack LiveData 如何安全的观察数据

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

LiveData的介绍和使用不在累述,直接看官方文档,本篇文章旨在讲解LiveData存在的意义以及实现的原理。 LiveData 为什么会出现?之前看过重学安卓的小专栏的讲解:

LiveData 它被设计为仅限于负责 数据在订阅者生命周期内的被分发,除了 setValue / postValue 发送数据,以及 observe订阅数据. 没有多余的方法。(摘自:重学Android KunMinX-LiveData诞生的设计原因)

LiveData 只有如下简单的几个类:

image.png

LiveData 其实就是为了解决数据分发、统一数据分发一致性、数据在订阅者生命周期内分发感知生命周期。 Google的描述的LiveData的优势如下:

image.png

下面我们来一一验证,LiveData的优势。

postValue/setValue

LiveData只存在两个方法postValue/setValue来进行数据的分发,那么这两个方法有什么区别呢?

postValue: 可以在任意的线程下执行。 setValue: 只能在主线程下执行。

 //<T> 决定livedata 持有的数据类型
        liveData = MutableLiveData<String>()       
//设置持有的数据
        //postValue 可以在任意的线程下执行
        liveData.postValue("1")
        thread {
            liveData.postValue("3")
        }
        //setValue 只能在主线程执行
        liveData.value = "2"

LiveData中源码的实现如下:实现的方式非常简单,最终都会调用到setValue最终存储在mData

    protected void postValue(T value) {
        boolean postTask;
        synchronized (mDataLock) {
            postTask = mPendingData == NOT_SET;//NOT_SET 是一个空对象
            mPendingData = value;//存储发送的数据
        }
        if (!postTask) {//如果mPendingData 不等于 NOT_SET 说明mPostValueRunnable还没有执行完毕
            return;
        }
        //主线程执行mPostValueRunnable
        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    }
	//主线程执行Runnable
	private final Runnable mPostValueRunnable = new Runnable() {
        @SuppressWarnings("unchecked")
        @Override
        public void run() {
            Object newValue;
            synchronized (mDataLock) {
                newValue = mPendingData;
                mPendingData = NOT_SET;//将mPendingData置为空对象 对应了上述的postTask
            }
            setValue((T) newValue);//最终还是调用了setValue()方法
        }
    };

    @MainThread //注解 标注了在主线程执行
    protected void setValue(T value) {
        assertMainThread("setValue"); // 判断是否在主线程
        mVersion++;//版本号 后续会用到
        mData = value;//mData 真实的数据
        dispatchingValue(null);//将数据分发给观察者
    }

发布/订阅数据

从上述的postValue/setValue 的方法,我们可以看到最终都会调用到setValue并且调用了 dispatchingValue 进行发布数据。

LiveData中订阅数据,通过observe方法实现订阅数据:

        //注册订阅者
        //LifecycleOwner AppCompatActivity进行了实现
        liveData.observe(this, {
            Log.e(&#
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值