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()
进行空检查之外,没有什么特别的功能
谷歌的回答:
我们应该如何解决这个问题?
首先,我们应该修复潜在的错误
- 找到碎片在某个时间点可以分离的所有位置
- 更改代码,如下面的示例所示
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
}