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
观察器示例的方式。这是一个等待悄悄发生的大问题,我希望他们至少能让人们意识到
我有一个可以上传图片的 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
观察器示例的方式。这是一个等待悄悄发生的大问题,我希望他们至少能让人们意识到