Как управлять Disposable в RxJava
Что проверяют
Понимаете ли вы, что подписка в RxJava живёт, пока её явно не отменят, и умеете ли привязать её к жизненному циклу Android-компонента. Следом почти всегда спрашивают разницу между clear() и dispose() у CompositeDisposable.
Как отвечать
Каркас на RxJava 3:
Disposable: возвращается изsubscribe(), умеетdispose()иisDisposed(). После отмены цепочка выше получает сигнал и освобождает ресурсы: таймеры, сетевые вызовы, слушатели;CompositeDisposable: контейнер для нескольких подписок.clear()отменяет все и оставляет контейнер рабочим,dispose()отменяет все и закрывает его: любая подписка, добавленная позже, отменится сразу. Поэтому во фрагменте, который пересоздаёт view, нуженclear();- где отменять: во
ViewModelвonCleared(), воFragmentподписки на view вonDestroyView(), вActivityпо парному методу: подписались вonStart(), отменили вonStop(); SerialDisposable: для одной заменяемой подписки, например поиска по вводу.set()отменяет предыдущую автоматически;- автоматизация: библиотека AutoDispose или
takeUntilс событием жизненного цикла снимают ручной учёт.
Добавьте про ошибки: subscribe() без onError отправит ошибку в RxJavaPlugins.onError как OnErrorNotImplementedException, а ошибки, пришедшие после отмены, попадают туда же как UndeliverableException. Без глобального обработчика RxJavaPlugins.setErrorHandler, поставленного в Application, приложение в обоих случаях упадёт.
Новый код Android-команды обычно пишут на корутинах и Flow, RxJava чаще живёт в старых модулях.
Где спотыкаются
Путают clear() и dispose(). Вызвали dispose() в onDestroyView(), а после возврата на фрагмент новые подписки отменяются в момент добавления, и экран молча не обновляется.
Думают, что dispose() мгновенно останавливает работу. Потоку посылается прерывание, но блокирующий код, который его не проверяет, доработает до конца, а его исключение придёт уже как UndeliverableException.
Подписываются без сохранения Disposable. Лямбда держит ссылку на Activity, и после поворота экрана старая активити остаётся в памяти до завершения потока.