Удаление живых данных, созданных Observer внутри замыкания - PullRequest
0 голосов
/ 05 февраля 2019

У меня проблема с удалением наблюдателя данных в реальном времени, созданного внутри замыкания.

Обозреватель создается следующим образом:

recordingListener.startRecording() {ID ->
        this.ID = ID
        locationViewModel.getAllByID(ID).observe(this, android.arch.lifecycle.Observer {locations ->
            myViewService.showDataOnMap(locations!!)
        })
    }

Я пытаюсь удалить его следующим образом:

locationViewModel.getAllByID(ID).removeObservers(this)

Но, похоже, наблюдатель сохраняется даже после вызова removeObserver.Я думаю, что проблема вызвана тем фактом, что наблюдатель создан внутри замкнутого пространства, или, возможно, я делаю что-то еще неправильно.

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема заключается в последующих вызовах locationViewModel. Я делал больше вызовов с тем же идентификатором.Это препятствует удалению locationViewModel Observer.

Чтобы решить эту проблему, я теперь использую расширение LiveData ObserveOnce при последующих вызовах locationViewModel.Все, что он делает - это просто упрощает управление вызовами ViewModel, для которых требуется только один ответ.

Я не могу сказать, является ли это наилучшей практикой или нет, и его необходимость, вероятно, проистекает из плохой архитектурыв моем приложении, но для этого он работает и работает хорошо, поэтому счастливые дни, вот код Observe однажды:

fun <T> LiveData<T>.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer<T>) {
    observeForever(object : Observer<T> {
        override fun onChanged(t: T?) {
            observer.onChanged(t)
            removeObserver(this)
        }
    })
} 

Я называю это так:

locationViewModel.getAllByID(ID).observeOnce(this, Observer {locations ->

})
...