Удаление прослушивателя снимков Firestore из функции, возвращающей LiveData - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь оптимизировать производительность в своем приложении и заметил, что я не удаляю слушателей 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

1 Ответ

0 голосов
/ 03 июля 2018

Есть два способа добиться этого. Первым из них будет прекращение прослушивания изменений, и это можно сделать в вашей функции onStop(), вызвав функцию remove() для вашего ListenerRegistration объекта следующим образом:

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

Подход заключается в том, чтобы вы передали свою активность в качестве первого аргумента в функции addSnapshotListener(), чтобы Firestore мог автоматически очищать слушателей при остановке активности.

var registration = dataDocumentReference
        .addSnapshotListener(yourActivity, listener)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...