В чем разница подходов coroutines и RxJava
Что проверяют
Понимаете ли вы разницу в модели, а не только в синтаксисе: корутины это приостанавливаемые функции со структурной конкурентностью, RxJava это библиотека реактивных потоков с операторами. Следом спрашивают про отмену, ошибки и перевод проекта с Rx на корутины.
Как отвечать
Сравнивайте по осям:
- модель: одиночный результат в корутинах это
suspend-функция, поток значений этоFlow. В RxJava под каждый случай свой тип:Single,Maybe,Completable,Observable,Flowable; - потоки выполнения: в Rx их задают
subscribeOnиobserveOn, в корутинахDispatchers.IO,Dispatchers.Default,Dispatchers.MainиwithContextдля переключения; - жизненный цикл: в Rx подписки закрывают вручную через
CompositeDisposable. У корутин это делает scope:viewModelScopeотменяет всё запущенное приonCleared, отмена идёт по иерархииJob; - ошибки: в Rx ошибка приходит в
onErrorи завершает поток. В корутинах исключение поднимается к родителю и отменяет соседей, если не взятьsupervisorScopeилиSupervisorJob, воFlowесть операторcatch; - горячие потоки:
Flowхолодный, как обычныйObservable, а место сабжектов занимаютStateFlow(ближе кBehaviorSubject) иSharedFlow; - backpressure: в Rx для него отдельный
Flowable, воFlowон встроен через приостановку, плюсbufferиconflate.
Экосистема Android сейчас Kotlin-first: Room, Paging 3, DataStore и Retrofit поддерживают suspend и Flow напрямую. RxJava живёт в старых кодовых базах, мигрируют постепенно через kotlinx-coroutines-rx3 с await() и asFlow().
Где спотыкаются
Пишут GlobalScope.launch, как в старых примерах. Такая корутина не привязана к экрану и переживает его, это ровно та утечка, от которой корутины должны защищать.
Называют корутины «лёгкими потоками», которые быстрее Rx. Выполняются они на тех же пулах потоков, а отмена кооперативная: блокирующий код без точек приостановки или проверки isActive не остановится.
Ловят исключения через catch (e: Exception) или runCatching и глотают CancellationException. Отмена ломается молча, и корутина работает дальше после ухода с экрана.