这个问题是来自一位粉丝的投稿,他说他在哔哩哔哩面试的时分遇到了该问题,向我咨询下怎么回答。

问题解析

都知道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零根底入门到通晓,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )