参考文献:
https://juejin.im/post/5c25753af265da61561f5335
这个还用得着抄袭么?很简单的好吧,如果理解了Lifecycle的话。如果没有看Lifecycle我感觉看了也没啥用吧!!!
demo
LiveDataSample(AAC)中案例多的一笔(以上参考地址也有),在此懒得写!!!
值得学习
真正让我们应该注意的是 观察者模式,传说前几年乃至现在都是非常火的一个模式,之后我这边就一撸到底,继续探底 Rxjava,爽个够!!!
源码小解(没办法实在不多,只能叫小解)
核心点: observer.mObserver.onChanged((T) mData);
所以也可以这么认为:观察者模式剥光了衣服,让人流口水的就是一个callback回调(个人观点,当然此处肯定没那么简单,等看到RxJava再来细学习这个模式,解我们往下说)
LiveData.java
private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
return;
}
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
//核心中的核心
observer.mObserver.onChanged((T) mData);
}
1.何时有机会调用onChanged回调?
(1)有机会调用当然是在setvalue或者postvalue了(两者区别,下面讲),当调用setvalue时,先数据给mData,然后调用dispatchingValue方法
(2).dispatchingValue传递参数为null,所以会通过for循环根据条件判断调用considerNotify(以上已经写了该方法),这里体会了什么叫有机会调用onChange,因为该方法必须活动状态才会被调用,没活动状态mData数据也被赋值
(3).当Activity什么周期发送变化(Lifecycle已描述)时,调用sync()方法,非同步情况下会调用LiveData中LifecycleBoundObserver类的onStateChanged方法,该方法辗转反侧有一次有机会调用onChange回调。
LiveData.java
@MainThread
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}
void dispatchingValue(@Nullable ObserverWrapper initiator) {
if (mDispatchingValue) {
mDispatchInvalidated = true;
return;
}
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
if (initiator != null) {
considerNotify(initiator);
initiator = null;
} else {
for (Iterator, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.next().getValue());
if (mDispatchInvalidated) {
break;
}
}
}
} while (mDispatchInvalidated);
mDispatchingValue = false;
}
2.这里LiveData必须主线程方法assertMainThread()我也是看了上面参考地址上面的解说,代码不多,我找了一圈没找到,不急,暂时理解为Excutor线程池里面的感念,记录一下。
3.setvalue和postvalue方法如下,其中setvalue必须在主线程中操作,否则会报错;postvalue是通过创建主线程调用setvalue方法,通过setvalue方法调用dispatchingValue…
LiveData.java
protected void postValue(T value) {
boolean postTask;
synchronized (mDataLock) {
postTask = mPendingData == NOT_SET;
mPendingData = value;
}
if (!postTask) {
return;
}
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
/**
* Sets the value. If there are active observers, the value will be dispatched to them.
*
* This method must be called from the main thread. If you need set a value from a background
* thread, you can use {@link #postValue(Object)}
*
* @param value The new value
*/
@MainThread
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}
4.这里需说明LiveData如何避免内存泄漏?
(1)onStateChanged可以看出,如果处于销毁状态,会销毁掉数据(逻辑比较多,涉及到Livedata的也涉及到LifeycleRegister中的),并且切断拥有者Fragment(Activity)对观察者(数据)之间的关联已达到释放资源的目的,我这边说的比较俗,但是个人感觉完全可以这么去理解。
(2)在此做个进一步对比,如果我用普通的数据为什么不如LiveData:有个很重要的原因,如果普通数据使用不当,持有Fragment(或Activity),则导致Fragment(或Activity)不能被销毁(消耗的资源就大了),我想这个应该也是当今出现内存泄漏非常重要的一个原因。
疑问以及涉及知识点总结:
1.观察者设计模式之Rxjava新知识学习;
2.涉及到Executor :LiveData必须主线程方法assertMainThread(),代码不多,但是不能理解,为什么这里面就可以判断是否在主线程