Java 生命周期感知LiveEvent中的上下文为空

Java 生命周期感知LiveEvent中的上下文为空,java,android,kotlin,Java,Android,Kotlin,我的项目目前正在使用以下SingleLiveEvent实现 class SingleLiveEvent<T>( private val allowMultipleObservers: Boolean = false ) : MutableLiveData<T>() { private val mPending = AtomicBoolean(false) private val observers = mutableSetOf<Observ

我的项目目前正在使用以下
SingleLiveEvent
实现

class SingleLiveEvent<T>(
    private val allowMultipleObservers: Boolean = false
) : MutableLiveData<T>() {

    private val mPending = AtomicBoolean(false)
    private val observers = mutableSetOf<Observer<in T>>()

    @MainThread
    override fun observe(
        owner: LifecycleOwner,
        observer: Observer<in T>
    ) {

        if (!allowMultipleObservers && hasActiveObservers()) {
            Timber.tag(TAG)
                .w("Multiple observers registered but only one will be notified of changes.")
        } else {
            observers.add(observer)
        }

        // Observe the internal MutableLiveData
        super.observe(owner, Observer { t ->
            if (mPending.compareAndSet(true, false)) {
                observers.forEach { observer ->
                    observer.onChanged(t)
                }
            }
        })
    }
...
我们有时会收到一个崩溃消息,说
上下文
为空。但是,
requireContext()
不应该总是给我们一个有效的
Context
值,因为它附加到
viewLifecycleOwner

requireContext()
除了与
getContext()
进行空检查之外,没有什么特别的功能

谷歌的回答: 我们应该如何解决这个问题? 首先,我们应该修复潜在的错误

  • 找到碎片在某个时间点可以分离的所有位置
  • 更改代码,如下面的示例所示
在Java中:

Context context = getContext();
if (context == null) {
    // Handle null context scenario
} else {
    // Old code with context
}

来源:

您的实现存在缺陷-只要在非活动状态下连接多个观察者(或现有观察者变为非活动状态),就有可能注册多个观察者,然后,传递给
super.observe
的观察者包装器将失败,因为您正在强制所有观察者调用
onChanged
,而不考虑其实际状态


您应该将
hasaactiveobserver()
替换为
hasaobserver()
。但就我个人而言,我会研究解决方案实现
MediatorLiveData
,因为此实现无法正确处理进入销毁状态的观察者,将它们永远留在
观察者列表中。

100%谢谢,我刚刚看到了这一点。我们将使用
MediatorLiveData
来研究该解决方案,或者只是针对该黑客实现的另一种解决方案。
Context context = getContext();
if (context == null) {
    // Handle null context scenario
} else {
    // Old code with context
}