​布景

 LiveData 是 Jetpack 的一个成员库,从名字能够看出,这个库想要构建一个实时数据。而其结束确实也是朝着这方向去做的,当 LiveData 中的数据有改动时,会appstore有一个机制奉告外部数据改动。源码时代

 不仅如此,LiveData 仍是一个生命周期感知的组件,接下来会带着几个问题,结合源码接口测试的流程和步骤对其进行分析。

LiveData 为了处理什么问题?

 运用开发时,当需求异步加载数据,大多是经过回调的办法,来奉告更新 UI 。而更新 UI 前需求判别当时 Activity 或 Fragment 的生命周期,假APP如界面已销毁,就没有必要再去实行 UI监控他人微信聊天记录 更新。

 在运用 LiveData 前,这些生命周期的判别处理逻辑,都是需求咱们去写的源码编辑器编程猫下载,很费事。而运用 LiveData 后,在更新 UI 前,就不必再去判别 Activity 或 Fragm线程池的七个参数ent 的生命周期状况了,LiveData 内部现已做了生命周期的判别逻辑。

有什么利益?

 LiveData 是生命周期感知的,当有数据更监控怎样装置新时,其内部会判别数据查询者的生命周期状况,只需处于 active 状况的查询者,才会被告APP知;
 其界说结束时,有一个类型参数。如下,

public abstrAPPact class LiveData<T> {}

能够运用 LiveData 封装各种类型的数据,很活络。看看其 setValue 的完监控怎样衔接手机结源码,

protected void setValappearanceue(接口卡T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}

 当往 LiveData 政策里更新数据时,就运用了这个类型参数 T,这是一个 protected 的办法,在外部无法直接调用,能够经过运用 Mu源码之家tableLiveData 来更新数据,后边会讲到。

实时数据特性如何体现?
  • 查询 LiveDat监控怎样衔接手机a 数据改动

经过调用 LiveData 的 observe 办法,敞开数据的监测,当 LiveData 封装的接口数据有改动时,处于 active 状况的查询者就会收到数据改动奉告。observe 办法的界说如接口和抽象类的区别下,

public void observe(@NonNull LifecycleOwner owner, @NonNull Observe接口类型r<? super T> observer) {
...
}

 能够看到,这个办法接纳两个参数,第一个参数类型为 LifecycleOwner,从其承继线程池的七个参数联络可知,常用的AppCompatActivity 和 Fragment 政策都能够作为第一个参数传递过来,这个approve参数的效果就是让 LiveData 感知查询者的生命周源码买卖网站源码期。

  • 数据改动时,奉告查询者
    LiveData 的 setValue 和 postValue 是受保护的,无法直接调用。MutableLiveDapp装置下载ata 承继自 LiveData,并且敞开了 setValue 和 postVapproachalue 办法。

能够创立 MutableLiveData 政策,然后调用它的 setValue 和 postVal监控摄像头软件app下载ue 办法,将最新的数据更新进去。
当 LiveData 内部封装的 mData 数据产线程池面试题生改动时,其内部会调用分发数据接口卡的办法,将 LiveData 内部最新的数据,奉告数据查询者。数据分发办法如下,

void dispatchingValue(@接口Null接口的效果able ObserverWr监控怎样衔接手机apper initiator) {
...
do {
...
if (initiator != null) {
c线程池的七个参数onsiderNotify(initiator);
initiator = null接口crc过错计数;
} else {
for (Iterator<Map.Entry监控怎样装置<Obse线程池原理rver<? super T>, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.nappreciateext().getValue());
...
}
}
} w线程hile (mDispatchIn监控家用远程手机validated);
...
}

该办法会先做一些状况判别,最终调用 considerNot接口类型ify 来奉告调监控器什么牌子最好清晰度高查者数据的改动,如下,

private void considerNotify(ObserverWrapper observer) {
...
observer.mObser线程撕裂者ver.on线程的几种状况Changed((T) mData);
}

查询者收到数据接口类型的改动奉告后,即可进行 UI 的更新。

怎样做到生命周期感知?
  • 经过前面的介绍,能够知道在调用 LiveData 的 observe 方监控摄像头软件app下载法时,传递了一个 LifecycleOwner 政策,经过这个政策,即可感知查询者的生命周期。

在调用 observe 办法时,首先会将 owner 和 obser监控装置流程ver 封装在一监控他人微信聊天记录个 LifecycleBoundObserver 政策里。并将 LifecycleBoundObserver 政策设置为 owner 的 Lifecycle 的查询者,这样 LifecycleBoundObseappstorerver 就能够及时的监测到 owner 的生命周期改动。如下,

public void observe(@NonNull LifecycleOw源码网站ner owner, @N监控怎样衔接手机onNull Observer<? super Tapplication> observer) {监控怎样装置
...
LifecycleBoundObserver wr接口是什么apper = new LifecycleBoundObserv监控他人微信聊天记录eappreciater(owner, observer);
...
owner.getLifecyclapplicatione().ad源码网站dObserver(wrapper);
}
  • LifecycleBoundObserver 结束了 LifecycleE接口ventObserver 接口,而 LifecycleEventObserver 又结束了 LifecycleObserver。当 owner 的生监控体系命周期有改动时,LifecycleBoundObserver 结束的办法 onStateC源码编辑器hanged 会被调用,从而更新 LifecycleBoundObserver 其内部保护源码码头的生命周期情APP况 mActive。onStateChanged线程的几种状况 办法的结束如下,
@Override
public void onStateChanged(LifecycleOwner source,appstore LifecycAPPle.Event event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObser监控眼ver);
return;
}
activeStateChanged(s监控装置流程houldBeActive());
}

 onStateChanged 里首先会判别当时 owner 的生命周期状况,若监控他人微信聊天记录为 DESTROYED 状况,即会删去 Observer监控体系,这样后边当 LiveD源码编辑器ata 的数据有改动时,也不会奉告 Observer。
 经过这样 LiveData 就做到了生命周期感知,源码编辑器当有数据更新时,会经过 mActiv线程安全e 的值,来抉择是接口crc过错计数否需求奉告查询者数据有改动。只需 mA源码时代ctive 为 true 时,才会向查询者进行数据奉告。

LiveD接口类型ata 和 Mutapprovea源码编辑器手机版下载bleLiveData

 在阅览 LiveData 组件源码appointment时,发现其内部有两个类,一个是 LiveData,另一个是 MutableLiveData。MutableLiveData 承继自 LiveData,内部敞开了 setValue 和 postValue 办法。如下,

public class MutableLiveData&线程安全lt;T> extends LiveData<T> {
...
@Override
public监控他人微信聊天记录 void postValue(T value) {
super.postValue(value);
}
@Overr接口和抽象类的区别ide
public void setValue(监控器什么牌子最好清晰度高T value) {appstore
super.setValue(value);
}
}

 LiveData 的这两个办法是受保护的,外部无法直接调用。而 MutableLiveData 则将这两个办法敞开监控线程同步出来。能够以为 LiveData 里边的数据是不可变的,MutableLiveData 里封装的数application据是可变的。
 别的,setValue 办法必须在主线程中调用,postV源码分享网alappleue 办法可线程池的七个参数在恣意线程中调用。

LiveData 和 MutableLiveData 的源码网站选择?
 当向 View 层供应获取 LiveData 办法时,回来 LiveData,这样在 View 层,Activity/Fragment 无法修改 LiveData 政策中的数据(除非将回来的 LiveData 强转为 MappearanceutableLiveData), 如,

L监控怎样装置iveData<User> getUser() {
if (userLiveData == null) {
userLiveData = new MutableLiveData<>();接口卡
}
return userLiveData
}

 而在 ViewModel 层时,保存的是 Mutable接口和抽象类的区别LiveData 类型方app装置下载针,可直接对其数据进行操作,界说如下,

private MutableLiveData<User> userLiveData = null;
LiveData 组件中的规划方法

 LiveData 中的规划方法,给我形象最深的是查询者方法。无论是LiveData 的监控装置流程数据改动监控和奉告,仍是生命监控摄像头周期状况改动的监线程安全控和奉告,都运用的是查询者方法。源码编辑器手机版下载
 L源码编辑器编程猫下载iveData 数据监控场景,LiveData 是被查询者,Activity/Fragment 是查询者。
生命周期监控场景,Activity/Fragment 的生监控他人微信聊天记录命周期是被查询者,LiveData 是查询者。
限于篇幅,本文不再对查询者方法做继续拓展。

小结

 LiveData 仅仅是 Jetpack 的一个成员,Jetpack 大家族还有许多便当线程同步运用开发的库,后续会继续线程池更新其他库的研究结果。
 文章中的内容仅代表个人观点,如有误欢迎纠正,感谢~

欢迎注重我的技术群众号 “ToSimple”,每周approach有优质文章推送。