gpt4 book ai didi

firebase - 删除 LiveData 返回函数内的 Firestore 快照监听器

转载 作者:行者123 更新时间:2023-12-03 06:31:12 24 4
gpt4 key购买 nike

我正在尝试优化应用程序的性能,但我注意到我没有从存储库中删除 Firestore 监听器。

我的存储库有许多返回 LiveData 的函数,然后通过 ViewModels 和 View 的转换来观察该数据。

一次性操作绝对可以正常工作(上传、删除等),但永久监听器在事件结束时不会收集垃圾。

现在存储库内的函数如下所示:

// [...]
class Repository {
// [...]
fun retrieveCode() {
val observable = MutableLiveData<Code>()
val reference =
FirebaseFirestore.getInstance().collection(/**/).document(/**/)

reference
.addSnapshotListener { snapshot, exception ->
if(exception != null) {
observable.value = null
}

if(snapshot != null {
observable.value = snapshot.//[convert to object]
}
}

return observable
}
}

我找到了一种解决方法,即创建一个自定义 LiveData 对象,该对象在监听器变为非事件状态时处理监听器删除,如下所示:

class CodeLiveData(private val reference: DocumentReference): 
LiveData<Code>(), EventListener<DocumentSnapshot>{
private var registration: ListenerRegistration? = null

override fun onEvent(snapshot: DocumentSnapshot?,
exception: FirebaseFirestoreException?) {
if(exception != null) {
this.value = null
}

if(snapshot != null) {
this.value = snapshot.//[convert to object]
}
}

override fun onActive() {
super.onActive()
registration = reference.addSnapshotListener(this)
}

override fun onInactive() {
super.onInactive()
registration?.remove()
}
}

有没有一种方法可以解决这个问题,而不需要创建自定义类,而是通过改进类似于第一个示例的功能?

谢谢

埃米利奥

最佳答案

有两种方法可以实现这一目标。第一个是停止监听更改,这可以在 onStop() 函数中通过调用 ListenerRegistration 上的 remove() 函数来完成> 像这样的对象:

if (registration != null) {
registration.remove();
}

该方法是将您的事件作为 addSnapshotListener() 函数中的第一个参数传递,以便 Firestore 可以在事件停止时自动清理监听器。

var registration = dataDocumentReference
.addSnapshotListener(yourActivity, listener)

关于firebase - 删除 LiveData 返回函数内的 Firestore 快照监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51158346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com