Emi*_*pis 2 kotlin firebase google-cloud-firestore
我正在尝试优化我的应用程序的性能,但我注意到我没有从我的存储库中删除 Firestore 侦听器。
我的存储库有许多返回 a 的函数,LiveData然后通过来自ViewModels视图的转换进行观察。
一次性操作绝对可以正常工作(上传、删除等),但是当活动完成时,永久侦听器不会被垃圾收集。
现在存储库中的函数如下所示:
// [...]
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
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一种解决方法,即创建一个自定义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()
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在不创建自定义类的情况下解决这个问题,而是通过改进类似于第一个示例的函数?
谢谢,
埃米利奥
有两种方法可以实现这一目标。第一个是停止监听更改,这可以onStop()通过remove()在您的ListenerRegistration对象上调用函数来完成,如下所示:
if (registration != null) {
registration.remove();
}
Run Code Online (Sandbox Code Playgroud)
方法是将您的活动作为函数中的第一个参数传递addSnapshotListener(),因此 Firestore 可以在活动停止时自动清理侦听器。
var registration = dataDocumentReference
.addSnapshotListener(yourActivity, listener)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2795 次 |
| 最近记录: |