Удаление наблюдаемых

Этот вопрос связан с Android и жизненными циклами. Раньше я бы завел серию тем и подписался бы на них при создании.

После уничтожения я бы пометил все предметы как завершенные, предполагая, что он избавляется от всех подписчиков.

В Android Studio 3.1 я получаю предупреждения для любого подписчика, который «не используется». Решение состоит в том, чтобы добавить их в «заполняемый одноразовый», который я затем удаляю при уничтожении.

Является ли «композитный одноразовый» все, что мне нужно для правильной отмены запросов после уничтожения? Помог ли мой предыдущий способ маркировки предметов как завершенных и нужен ли он в данном случае?

В качестве примера кода:

val observable: PublishSubject<Int> = PublishSubject.create()
val disposable = observable.subscribe { /* subscription */ }

fun onDestroy() {
    observable.onComplete() // is this line necessary or helpful?
    disposable.dispose()
}

person Allan W    schedule 16.09.2018    source источник
comment
Возможно, вы захотите изучить объекты жизненного цикла, есть более простые способы убедиться, что объекты очищены в onDestroy. developer.android.com/topic/libraries/architecture/lifecycle   -  person Gabe Sechan    schedule 17.09.2018
comment
Я не уверен, совместим ли жизненный цикл только с androidx или нет, но мне все равно было бы полезно знать, как использовать это в настройках за пределами Android.   -  person Allan W    schedule 17.09.2018


Ответы (2)


observable.onComplete() завершит ваш поток и, таким образом, отправит это событие всем подписчикам, слушающим onComplete, вам не нужно удалять поток после onComplete (это делается автоматически).

disposable.dispose() остановит поток, и полное событие не будет запущено.

Если вы не слушаете полное событие, оба они одинаковы, поэтому для ответа на ваш вопрос вам не нужны обе строки.

person Samuel Eminet    schedule 16.09.2018

Делать это на onDestroy не очень хорошая идея, потому что существует разрыв между остановкой фрагмента/активности и его уничтожением. Если ваш наблюдаемый срабатывает во время этого промежутка, вы, скорее всего, будете выполнять некоторую работу с пользовательским интерфейсом, которая приведет к исключению, поскольку вы пытаетесь манипулировать объектами пользовательского интерфейса после остановки действия/фрагмента.

Лучшим подходом является выгрузка этой бизнес-логики в модель представления, а затем пользовательский интерфейс прослушивает обновления из модели представления через LiveData (который сам осведомлен о жизненном цикле, поэтому он заботится о подписке/отмене подписки по мере необходимости). Показанный здесь код будет затем перемещен в метод onCleared модели представления.

Проверьте это и это для справки.

person Francesc    schedule 16.09.2018
comment
Как быть в случае без livedata? Код для уничтожения в настоящее время предназначен для представлений, но, учитывая это объяснение, может быть нормально сделать это во время onStop для действий, верно? - person Allan W; 17.09.2018
comment
Да, если вы не используете LIveData, вы должны отказаться от подписки в onStop и повторно подписаться в onStart. - person Francesc; 17.09.2018