这是我参加8月更文应战的第2天,活动概况检查:8月更文应战
概述
官方doc
LiveData归于Jetpack的架构组件,目的在于当底层数据产生更改的时分能够奉告到上层UI进行更新,协作MVVM架构使用,是非常舒畅的。线程池的使用
个人对它的了解分红两部分:
1.LivaData=Live+Data,Live是指它是有生命的,线程池的七个参数或许说能够感知到生命周期的改动。Dmvvm原理ata是指它的本质仍是一个数据存储相关的类。
2.实践的结束便是观察者模型,Livemvvm形式和mvc的差异Data的观察者(如咱们在observe办法的时分传入的匿名observ线程池面试题er政策)是与Lifecycle政策(通常是Activity/Fragment)绑定在一同的,在其处于生动线程的几种状况情线程池况(比方线程池对应的Activity处于started,resumed)的时分,LiveData(被观察者)的更新将会奉告架构师需求把握哪些常识到观察者(回调到onChanged办法)。
用它的利益:①最重要的,LiveData作为被观察者能够感知到观察者(Activity/Fragment)架构是什么意思的生命周期,自行去办理本身的生命周期。②如上说的,只有当Activity架构是什么意思或许Fragment处于生动状况的时分,才干收到LiveData数据更架构图用什么软件做新线程池创建的四种的奉告,这能够保证,数据产生更新的时分,UI的状况也是能够更新的。③能够根据观察者的生命线程池周期改动,在观察者毁掉后进行自我收拾,防止内存走漏。④当架构师证书界面从头康复到生动状况或许从头创建的时分,会立即接收到最新的数据。
用mvvm形式法
见官方文档。
剖析:
LiveData本身是一个抽象类,在Jetpack组件中仅有的子类是MutableLiveData。公开了两个方线程安全法setValue和postVa链表数据结构lue。两个办法用来更新LiveData的值,前者只能在主线程中调用,后者能够在子线mvvm和mvc的差异程中调用,通过Handler消息机制,奉告到主线程更新。
在这剖析这两个办法之前,先来看下,观察者如何订阅LiveData,即LiveData的observe办法线程池创建的四种:
// 第一个参数是Lifecycle的持有者,比方Activity、Fragment
// 第二个参数是观察架构师薪酬一月多少者政策,咱们一般便是直接创建一个匿名政策
public void observe(LifecycleOwner owner, Observer<T> observer) {
// 假定观察者在订阅LiveData的时分现已处于destoryed状况,直线程池创建的四种接越过订阅
if (owner.getLifecycle().getC链表urrentState() ==架构师薪酬一月多少 DESTROY线程池参数设置准则ED) {
return;
}
// 将owner与observer封装成LifecycleBoundObserver政策,这个政策首要封装了
// 对Lifecycle的生命状况的赋值操作以及状况改动时对观察者进行撤销订阅的操作。
LifecycleBo架构图模板undObserver wrapper = new LifecycleBo线程undObserver(owner, observer);
// mObservers是一架构师和程序员的差异个支撑在迭代的过程中进行更改的链表结构(寄存E线程优化开不开ntry<K,V>mvvm原理面试;),
// 寄存的是观察者和上面的包装政策,留心假定链表现已寄存了某一个key为observer的entry
// 不是去更新这个entry而是直接回来value。
ObserverWrapper existing = mObservers.putIf架构师薪酬一月多少Ab线程池创建的四种sent(observer, wrapper);
// 假定回来的va线程池面试题lue不是null,然后去确定一下,这个observer的owner与新传入的owner
// 是不是一同的,假定一同,就表明这个线程池的七个参数观察者现已绑定了某一个owner,不能链表重复绑定
if (existing != null && !existing.isAttachedTo(owner链表)) {
throw new IllegalArgumentException( "Cannot add the same observer"
+ " with different lifecycles" );
}
// 假定回来的value不是null,但是也没有进入上面的反常抛线程安全出
// 那便是这一次绑定的owner是相同的,没有必要重复绑定相同的owner
if (existing != null) {
return;
}
// 为owner增加生命周期观察者,这样线程是什么意思wrappe线程池面试题r,或许说observer就能够链表逆序感知到
// owner(Activity/Fragment)的生命周期,当其生命周期产生改动的时分,
// 能够调用到wrapper的onStateChanged,去更新生动状况
owner.getLifecycle().ad链表的特色dObserver(wrapper);
}
LifecycleBoundObserver的onS线程池品种tateChange线程池面试题d办法:
public void onStateChanged(L链表指针ifecycleOwner source, Lifecycle.Event event) {
// 假定组件的生命周期是毁掉状况,那么会主动的removeObserver移除观察者,
// 然后免除observer链表的特色对LifecyclerOwner的引用,防止内存走漏的产生
if (mOwner.getL线程池面试题ifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
// 假定不是Destoryed状况,那么当Owner的生命周期改动时,会去更新到LiveData的生动状况
activeStateChanged(shouldBeActiv架构师和程序员的差异e());
}
上面是对LiveData的生命状况相关的剖析,然后看下对L线程安全iveData的赋值操作。
setValue:
protected void setValue(T value) {
assertMainThread(mvvm原理 "setValue" );// 非主线程Illemvvm形式和mvc的差异galState链表的特色Exception
mVersion++;// 符号当时data的版别
mData = value;// 赋值data
dispatchingValue(null);
}
setValue调用的dispatchingValue,传入的是null:
private void dispatchingValue(@Nullable ObserverWrapper initiator) {
// 假定正在分发value,则直接return
if (mD架构图ispatchingValue) {
mDispatchInvalidated = true;
return;
}
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
i链表怎么调理长度f (initiator != null) {
// 后续
co线程是什么意思nmvvm形式siderNotify(initiatmvvm形式or);
initiator = null;
} else {
// 遍历mObserv线程ers架构师链表,去抉择是否需求奉告观察者更新
for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.next().getValue());
if (mDispmvvm形式和mvc的差异atchInvalidated)链表c语言 {
br线程池面试题eak;
}
}
}
} while (mDispatchInvalidated);
mDispatchingValue = false;
}
considerNotify:
pr架构师薪酬一月多少ivate void considerNotify(ObserverWrapp线程池的使用er observer) {
// 假定观察者不处于生动状况,则直接越过
if (!observer.mActive) {
return;
}
// 或许出现Owner的生命周期改动了,但是LiveData并没有收到相关奉告,链表的特色
// 这儿主动去获取Owner的当时(最新)生命状况
// shouldBeActivie在这两种状况下回来true链表数据结构
// STARTED:对应的便是Activity生命周期的调用onStart之后,onPause之前
// RESUMED: on线程安全Resume调用之后
if (!observer.shouldBeActive()) {
// 假定处于Owner的生命状况不生动,这儿更新下架构师薪酬一月多少
observer线程是什么意思.activeStateChanged(false);
return;
}
// 假定最新的数据版别不大于上一次改变的版别,便是架构师和程序员的差异没改动,那就直接return
if (observer.mLastVersion >=线程和进程的差异是什么 mVe链表和数组的差异rsion) {
return;
}
// 更新上一次改变的版别值
observer线程的几种状况.mLastVersion = mVersion;
//链表逆序 会掉到observer的onChanged办法,传入新的data
//也便是咱们在订阅LiveData的时分,传入的匿名政策重写的on链表查询Change架构d办法
// 到这儿,观察者就收到了LiveData的数据改变的奉告。
observer.mObserver.onChanged架构图模板((T) mData);
}
p链表回转ostValue:
postValue用于在子线程奉告主线程livedata产生了mvvm原理面试改动,代码线程池如下:
protected void postValue(T value) {
boo线程池lean postTask;
synchronized (mDataLock) {
postTask = mPendingData == NOT_SET;
// mPendingData线程和进程的差异是什么
mPendingData = value;
}
if (!postTask) {
return;
}
// 将mPostValueRunnable这个使命抛到主线程实行
ArchTaskEx线程池的七个参数ecutor.getInstance().postToMainThre架构图模板ad(mPostValueRunnable);
}
先看下mPostValueRunnable:
private final Runnable mPostValueRunnable = new Runnable() {
@Override
public void run() {
// 在主线程中结束data的更新
Object newValue;
synchronized (mDataLock) {
newValue = mPendingData;
// 然后康复mPendi架构图模板ngData为未设置状况
// 其实mPendingData的效果便是辅佐保证data的更新是在主线程中进行
mPendingData = NOT_SET;
}
// postValue终线程池回绝战略究调用的也是setValue
setValue((T) newValue);
}
};
上面还有一点ArchTaskExecutor,这是Jetpack架构中比较独立的一个部分,看下一点:
TaskExecutor是抽象基类,首要界说了分别在子线程池和主线程处理Runnable的才干。
DefaultTaskExecutor是TaskExecutor的默许结束:
public class DefaultTaskExecutor extends TaskExecutor {
pMVVMrivate final Object mLock = new Object();
// IO线程池是固定数量为2的线线程安全程池
private ExecutorServ架构师和程序员的差异ice mDiskIO = Executors.newFixedThreadPool(2);
@Nullable
private volatile H链表怎么调理长度andler mMainHandler;
@Override
public void executeOnDiskIO(Runmvvm设计形式nable ru链表回转nnable) {
mDiskIO.execute(runnable);
}
@Override
public void postToMainThre线程池的七个参数ad(Runnable runnable) {
// runnable线程池回绝战略通过相关主线程链表的Handler,post回主线程实行
if (线程撕裂者mMainHandler == null) {
sync链表数据结构hroniz线程池的七个参数ed (mLock) {
if (mMainHandler == null) {
mMainHandler = new Handler(Looper.getMainLoope线程池工作原理r());
}
}
}
mMainHandler.post(runnable);
}
@Override
public boolean isMainmvvm的了解Thread() {
return Looper.getMainLomvvm的了解oper().getThread() == Thread.currentThread();
}
}
ArchT链表askExecutor也是TaskExecutor的结束,与DefaultTaskExecutor的不同在于,ArchTaskExecutor的全部对使命的处理都是通过m线程是什么意思Delegate这个TaskExecutor的署理政策来结束的,通过ArchT线程池askExecutor的set办法,客户端能够通过承继TaskExecutor的方式,架构师需求把握哪些常识结束自己的Runnable使命处理逻辑。
@NoMVVMnNull
private TaskExecutor mDelegate;// 默许结束便是mDefaultTaskExecutor
@NonNull
private TaskExecutor mDef线程池面试题aultTaskExecutor;// DefaultTaskExecu线程是什么意思tor实例线程池原理