firebase - 在 LiveData-returning 函数中删除 Firestore 快照侦听器
问题描述
我正在尝试优化我的应用程序的性能,我注意到我没有从我的存储库中删除 Firestore 侦听器。
我的存储库有许多返回 a 的函数,LiveData
然后通过 Transformations fromViewModels
和 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()
调用remove()
函数来在你的函数中完成,ListenerRegistration
如下所示:
if (registration != null) {
registration.remove();
}
该方法是将您的活动作为函数中的第一个参数传递addSnapshotListener()
,因此 Firestore 可以在活动停止时自动清理侦听器。
var registration = dataDocumentReference
.addSnapshotListener(yourActivity, listener)
推荐阅读
- angular - Angular Build 失败
- c++ - 如何让 BOOST_FOREACH 使用不可复制的右值?
- google-app-maker - Google App Maker 无法重新识别自己的一些小部件
- java - ZonedDateTime 忽略 ss 部分的 00
- angularjs - 我正在尝试将数据从自定义角度 JS 服务返回到控制器,但它总是返回“{}”
- reactjs - 到达路由器 props.navigate
- cucumber - Cucumber 使用针对 Cucumber 4.x 的 testNG 运行器重新运行失败的测试并连接结果
- label - 如何修复 Latex 中错误的表格标签?
- c# - 在 C# 网站中调用 Web API 方法时的 SSL/TLS 证书验证相关问题
- php - 我需要创建一个多维数组