升级SingleLiveEvent时observe/removeObserver提示未覆盖任何内容
问题原因及解决方案
核心变更说明
在AndroidX Lifecycle 2.4.0及后续版本中,LiveData类的两个核心方法签名发生了泛型逆变修改:
- 原方法签名:
fun observe(owner: LifecycleOwner, observer: Observer<T>) fun removeObserver(observer: Observer<T>) - 新方法签名(泛型逆变):
fun observe(owner: LifecycleOwner, observer: Observer<in T>) fun removeObserver(observer: Observer<in T>)
你的代码中仍使用Observer<T>作为参数类型,和父类方法签名不匹配,因此编译器提示“未覆盖任何内容”。
修改后的完整代码
将observe和removeObserver方法的Observer<T>替换为Observer<in T>,同时同步修改observers集合的泛型类型,即可解决问题:
import androidx.annotation.MainThread import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import java.util.concurrent.atomic.AtomicBoolean class SingleLiveEvent<T> : MutableLiveData<T>() { private val pending = AtomicBoolean(false) private val observers = mutableSetOf<Observer<in T>>() private val internalObserver = Observer<T> { t -> if (pending.compareAndSet(true, false)) { observers.forEach { observer -> observer.onChanged(t) } } } @MainThread override fun observe(owner: LifecycleOwner, observer: Observer<in T>) { observers.add(observer) if (!hasObservers()) { super.observe(owner, internalObserver) } } override fun removeObservers(owner: LifecycleOwner) { observers.clear() super.removeObservers(owner) } override fun removeObserver(observer: Observer<in T>) { observers.remove(observer) super.removeObserver(observer) } @MainThread override fun setValue(t: T?) { pending.set(true) super.setValue(t) } @MainThread fun call() { value = null } }
额外说明
这次泛型逆变的修改是为了提升API灵活性,允许传入更宽泛的Observer类型(比如Observer<Any>可以观察LiveData<String>),同时完全兼容原有业务逻辑。
内容的提问来源于stack exchange,提问作者Víctor Martín
相关产品推荐
相关产品推荐

