概述
MutableLiveData笔记
- MutableLiveData是什么?
- LiveData是什么?
- LiveData常用的方法
- MutableLiveData和LiveData的区别
- 关于postValue和setValue的机制简单理解
MutableLiveData是什么?
public class MutableLiveData
extends LiveData<T>
java.lang.Object
↳ android.arch.lifecycle.LiveData<T>
↳ android.arch.lifecycle.MutableLiveData<T>
MutableLiveData是LiveData的子类
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方法,此时观察者可以接收到数据变化。
不足之处欢迎批评
最后
以上就是神勇巨人为你收集整理的【Android】MutableLiveData与LiveDataMutableLiveData是什么?关于postValue和setValue的机制简单理解的全部内容,希望文章能够帮你解决【Android】MutableLiveData与LiveDataMutableLiveData是什么?关于postValue和setValue的机制简单理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复