removeObserver 不工作,观察者一直被执行

removeObserver not working, observer keeps being executed

我有一个可以上传图片的 activity。在这个 activity 中,我有以下观察者,它工作得很好:

pictureViewModel.customCreateResult.observeForever { result -> onResponsePostPicture(result!!)}

我需要使用 observeForever,因为用户有时会导航到其他活动。这工作正常,不是问题。当用户决定将此 activity 留给观察者时。所以当完成 activity 我打电话给:

override fun onDestroy() {
        super.onDestroy()
        pictureViewModel.customCreateResult.removeObserver{ result -> onResponsePostPicture(result!!)}
}

例如,当上传了 4 张图片中的 2 张,然后用户完成 activity 但决定重新打开 activity。我从观察者那里得到了最后两张照片的回复。所以我的 removeObserver 不工作。我做错了什么?

您不是在每次创建新观察者时都添加和删除同一个观察者。您正在传递一个 lambda,它每次都是一个新的观察者。下面是一个例子。

private var observer:Observer<String> = Observer {
    onResponsePostPicture(it!!)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    pictureViewModel.customCreateResult.observeForever(observer)
}

override fun onDestroy() {
    super.onDestroy()
    pictureViewModel.customCreateResult.removeObserver(observer)
}

或者您可以使用 #removeObservers(this) 这将删除所有与 Lifecycle Owner 相对应的观察者。

override fun onDestroy() {
    customCreateResult.removeObservers(this)
    super.onDestroy()
}

补充一下@ADM 所说的,问题具体在于将 lambda 传递给 observeForever/removeObserver 创建一个新的 Observer 对象 系统坚持。即使您通过将相同的 lambda 实例保存为 val 或类似的任何东西来传递它,在内部它也是一个新的且完全不同的对象。

所以通过这种方式注册一个观察者,你不能用removeObserver删除它,它会继续接收事件,如果您的 lambda 引用了返回到 Activity.

之类的东西

文档不会就此警告您,observeForever 的代码完成甚至建议使用 lambda 版本,这是编写其余 Kotlin LiveData 观察器示例的方式。这是一个等待悄悄发生的大问题,我希望他们至少能让人们意识到