Я пытаюсь оптимизировать производительность в своем приложении и заметил, что я не удаляю слушателей Firestore из своего репозитория.
Мой репозиторий имеет ряд функций, которые возвращают 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
}
}
Я нашел обходной путь, который заключается в создании пользовательского 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()
}
}
Есть ли способ решить эту проблему, не создавая пользовательский класс, а улучшив функцию, аналогичную первому примеру?
Спасибо
Emilio