这个问题是来自一位粉丝的投稿,他说他在哔哩哔哩面试的时分遇到了该问题,向我咨询下怎么回答。
问题解析
都知道LiveData会持有可被观察的数据。 而且一起它也是一种可感知生命周期的组件,意味着该组件重视其他app组件的生命周期,如Activity、Fragment,该组件能确保,仅仅在Activity\Fragment等组件都处于活泼的生命周期状态的时分,才去更新app组件。
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
// 运用Lifecycle监听生命周期
owner.getLifecycle().addObserver(wrapper);
}
能够看到其实LiveData就是借助了Lifecycle感知生命周期的。将LifecycleBoundObserver wrapper
添加为观察者,当有生命周期改变时将会执行:onStateChanged
class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
@NonNull
final LifecycleOwner mOwner;
LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
super(observer);
mOwner = owner;
}
@Override
boolean shouldBeActive() {
// 假如当时状态为 STARTED或许RESUME则为true
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
//假如是DESTORY状态,则return
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
//状态改变且不为destory时执行
activeStateChanged(shouldBeActive());
}
@Override
boolean isAttachedTo(LifecycleOwner owner) {
return mOwner == owner;
}
@Override
void detachObserver() {
mOwner.getLifecycle().removeObserver(this);
}
}
在activeStateChanged
中假如当时改变的状态为活泼状态(shouldBeActive():true),则会调用到considerNotify
办法通知数据更新:
private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
return;
}
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
//假如数据没有改变,无需通知
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
//noinspection unchecked
observer.mObserver.onChanged((T) mData);
}
数据在每次修正时,都会进行mVersion++,因而能够运用mVersion判断数据是否发生修正,假如未发生改变则不会建议回调。
//postValue也会最终调用到setValue
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++; // 数据改变符号
mData = value;
dispatchingValue(null);
}
所以,LiveData的生命周期是经过Lifecycle监听的,一起LiveData会保护一个mVersion作为数据的版本号。当数据有修正时,才会进行通知回调。
怎么样?你学废了吗?
今天共享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧
重视大众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版
内容如下:
1.Android车载应用开发体系学习指南(附项目实战)
2.Android Framework学习指南,助力成为体系级开发高手
3.2023最新Android中高级面试题汇总+解析,离别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到通晓,构建高质量UI界面
6.Flutter技能解析与实战,跨渠道首要之选
7.Kotlin从入门到实战,全方面提升架构根底
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 功能优化实战+360全方面功能调优
10.Android零根底入门到通晓,高手进阶之路
敲代码不易,重视一下吧。ღ( ・ᴗ・` )