Я новичок в реактивном мире, поэтому, пожалуйста, потерпите меня, если я говорю что-то не так (пожалуйста, поправьте меня!).
Итак, я искал в Google и здесь что-то подобное, но я думаю, что не видел ничего вокруг того, что я сделал. Я использую библиотеку Rx2Firebase для получения некоторых данных из моей базы данных с помощью метода RxFirebaseDatabase.observeSingleValueEvent
, и я не мог понять, как я буду избавляться от созданного мной Observable. Таким образом, этот метод возвращает Maybe, и я хочу избавиться от этого Maybe после выполнения моего кода, но я не уверен, как это сделать (почему читайте ниже).
Мой текущий код выглядит примерно так:
private fun getUserStatus(callback: () -> Unit) {
RxFirebaseDatabase
.observeSingleValueEvent(myQuery,(entry::class.java))
.subscribe ({ item
myEntry = item
callback()
},{ e
Log.e("Error", e.message)
})
}
Из того, что я прочитал, наблюдаемые присваиваются переменной Disposable
, а затем я думаю, что эта переменная будет удалена? что-то вроде var disposable: Disposable = <Insert my code above for calling Firebase>
, и вы бы сделали это (из того, что я читал) внутри onDestroy
. Мой вопрос будет заключаться в том, как мне это сделать, если мой код не выполняется в действии или фрагменте? Я не мог просто добавить dispose()
в конце моего кода после .subscribe
, так как это просто завершило бы вызов до его завершения.
Вам не нужно избавляться от Maybe
после того, как ваш код был выполнен. Вы должны удалять любые наблюдаемые, когда вам нужно отменить основное действие. Поскольку вы используете Android, действие запускается из какого-то компонента, поддерживающего жизненный цикл. Это может быть Activity
, Fragment
или Service
. Если вы инициируете вызов из BroadcastReceiver
, вы должны запустить службу, чтобы сделать это вместо этого.
Для любого из этих компонентов у вас есть метод onDestroy
, где вы можете избавиться от наблюдаемого. Единственное, что вам нужно сделать, это распространить Disposable
до этого уровня:
private fun getUserStatus(callback: () -> Unit): Disposable =
RxFirebaseDatabase
.observeSingleValueEvent(myQuery,(entry::class.java))
.subscribe ({ item ->
myEntry = item
callback()
},{ e ->
Log.e("Error", e.message)
})
Исправление того, что я сказал в последний раз... не делайте этого на onViewDestroy, если вы используете вкладки. Это приведет к сбою, если другие вкладки также наблюдают то же самое.
Спасибо! Это то, что мне нужно. Это сработало, как задумано. Если есть какие-то супер нубы (например, я), я просто проверил onDestroyView() и onDestroy(), зарегистрировав свойство isDisposed, чтобы убедиться, что оно было удалено.