Избавление от наблюдаемых - PullRequest
       19

Избавление от наблюдаемых

0 голосов
/ 16 сентября 2018

Этот вопрос относится к 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()
}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

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

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

0 голосов
/ 17 сентября 2018

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

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

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

...