Android 面试总结 - LiveData,面试的时候突然遇到答不上的问题怎么办

本文详细探讨了Android LiveData的内部实现,包括如何感知生命周期、如何处理setValue和postValue的区别,以及在设置相同值时观察者是否接收到通知。通过对源码的分析,揭示了LiveData的工作原理,并为面试提供了宝贵的准备资料。
摘要由CSDN通过智能技术生成

if (existing != null) {

// 若 existing 不为 null,则忽略该调用。对应方法注释的第 12 点。

return;

}

// 将 owner 和 observer 的包装对象添加到 owner.getLifecycle()。对应方法注释的第 1 点。

owner.getLifecycle().addObserver(wrapper);

}

第一个问题中 LiveData 怎么感知生命周期感知?

我们可以回答了,调用 observe 方法时,会调用 owner.getLifecycle().addObserver 已达到感知生命周期的目的。 observe 方法的内容很少,接着看下 owner 和 observer 的包装对象 LifecycleBoundObserver

LiveData 的内部类

class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {

@NonNull

final LifecycleOwner mOwner;

// 构造函数 owner 赋值给属性 mOwner, observer 则调用了 super

LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {

super(observer);

mOwner = owner;

}

@Override

boolean shouldBeActive() {

return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);

}

/**

  • 当 source (也就是 mOwner) 的生命周期改变时会回调此方法

*/

@Override

public void onStateChanged(@NonNull LifecycleOwner source,

@NonNull Lifecycle.Event event) {

// 获取当前 mOwner 的生命周期状态

Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();

if (currentState == DESTROYED) {

// 如果是已销毁状态,则调用 LiveData#removeObserver 方法进行移除 mObserver (mObserver 是 LifecycleBoundObserver 的父类 ObserverWrapper 的属性,通过 ObserverWrapper 的构造函数来赋值),对应 LiveData#observe 方法注释的第 12 点。

removeObserver(mObserver);

return;

}

Lifecycle.State prevState = null;

while (prevState != currentState) {

prevState = currentState;

activeStateChanged(shouldBeActive());

currentState = mOwner.getLifecycle().getCurrentState();

}

}

@Override

boolean isAttachedTo(LifecycleOwner owner) {

return mOwner == owner;

}

@Override

void detachObserver() {

// 从 mOwner 中移除此观察者

mOwner.getLifecycle().removeObserver(this);

}

}

onStateChanged 方法中注释如果是已销毁状态,则调用 LiveData#removeObserver 方法进行移除 mObserver (mObserver 是 LifecycleBoundObserver 的父类 ObserverWrapper 的属性,通过 ObserverWrapper 的构造函数来赋值),对应 LiveData#observe 方法注释的第 12 点。 同时第一个问题已经得到了解决: **LiveData 怎么感知生命周期感知?需要取消注册吗?**LiveData#observe 看完啦,该看 setValue 和 postValue 了。

/**

  • Sets the value. If there are active observers, the value will be dispatched to them.

  • 设置值。如果存在活动的观察者,则会将值分派给他们。

  • This method must be called fro

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值