【Android】MutableLiveData与LiveData

MutableLiveData是什么?

public class MutableLiveData
extends LiveData<T>

java.lang.Objectandroid.arch.lifecycle.LiveData<T>android.arch.lifecycle.MutableLiveData<T>

MutableLiveDataLiveData的子类

LiveData是什么?

在这里插入图片描述
Android的官方文档种描述为可以在给定生命周期观察数据持有类
在这里插入图片描述
因此生命周期拥有者应和观察者成对添加,使用observe:当LiveData中的数据发生变化时,并且生命周期的状态为START或是RESUME状态时,观察者就能观察到数据变化。这么做的原因是避免资源的浪费,当所有者的状态变为destroy状态,观察者将自动被移除。

LiveData常用的方法

  • postValue
    在这里插入图片描述
    作用是在子线程更新数据,当然在主线程中也可以使用。
  • setValue
    在这里插入图片描述
    作用是在主线程中修改数据,注意只能在主线程中调用

注意两个方法都是protected修饰的,因此一般封装一个继承LiveData的类,在该类的中调用此方法。

  • observe

    void observe (LifecycleOwner owner, 
                    Observer<T> observer)
    

    作用是添加生命周期拥有者和观察者,当拥有者处于活跃状态时,观察者能接收到数据更新。

  • observeforever

    void observeForever (Observer<T> observer)
    

    作用是观察数据变化,可以无视生命周期的变化,因此需要手动移除。
    注意,此时已不需要添加生命周期拥有者。
    为什么可以不添加生命周期拥有者呢?因为这个方法的作用就如他的名字一样,一直观察数据是否变化。

        @MainThread
        public void observeForever(@NonNull Observer<? super T> observer) {
            assertMainThread("observeForever");
            AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
            ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
            if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
                throw new IllegalArgumentException("Cannot add the same observer"
                        + " with different lifecycles");
            }
            if (existing != null) {
                return;
            }
            wrapper.activeStateChanged(true);
        }
    

    最后一行就是其中的秘密

    void activeStateChanged(boolean newActive) {
        if (newActive == mActive) {
            return;
        }
        // immediately set active state, so we'd never dispatch anything to inactive
        // owner
        mActive = newActive;
        boolean wasInactive = LiveData.this.mActiveCount == 0;
        LiveData.this.mActiveCount += mActive ? 1 : -1;
        if (wasInactive && mActive) {
            onActive();
        }
        if (LiveData.this.mActiveCount == 0 && !mActive) {
            onInactive();
        }
        if (mActive) {
            dispatchingValue(this);
        }
    }
    

    在observeForever方法中调用wrapper.activeStateChanged(true),将其设置为常量true。
    同比observer方法,是将生命周期拥有者传入,再进行观察,如果状态发生改变立刻调用activeStateChanged。
    在这里插入图片描述
    在这里插入图片描述

  • removeObserver

    void removeObserver (Observer<T> observer)
    

    作用是移除指定的观察者

  • removeObservers

    void removeObservers (LifecycleOwner owner)
    

    作用是移除指定的生命周期拥有者下的所有观察者

MutableLiveData和LiveData的区别

其实MutableLiveData的源码很简单
在这里插入图片描述
只有两个方法postValue和setValue,但是和LiveData的区别就在于是用public修饰的。
因此个人觉得会比LiveData方便一些。

关于postValue和setValue的机制简单理解

调用postValue后执行顺序
在这里插入图片描述
从这里可以看出调用了setValue
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里调用了观察者的onChanged方法,此时观察者可以接收到数据变化。

不足之处欢迎批评

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值