Какие виды эмиттеров существуют в RxJava и в чем их отличия
Что проверяют
Знаете ли вы базовые реактивные типы RxJava и умеете ли выбрать нужный под задачу. «Эмиттер» здесь это источник и интерфейс Emitter внутри create(). Следом обычно спрашивают про backpressure и чем горячий источник отличается от холодного.
Как отвечать
В RxJava 2 и 3 пять базовых типов, у каждого свой эмиттер:
- Observable (
ObservableEmitter): ноль или много элементов,onNext,onError,onComplete. Backpressure не поддерживает, подходит для событий UI; - Flowable (
FlowableEmitter): то же с backpressure. ВFlowable.create()передаётсяBackpressureStrategy:BUFFER,DROP,LATEST,ERRORилиMISSING; - Single (
SingleEmitter): ровно один результат или ошибка. Типичный сетевой запрос через Retrofit; - Maybe (
MaybeEmitter): значение, пустое завершение или ошибка, например чтение из кеша; - Completable (
CompletableEmitter): только факт завершения, например запись в базу.
Внутри create() важно проверять isDisposed() перед долгой работой, регистрировать очистку через setCancellable или setDisposable и помнить, что null передавать нельзя: сразу NullPointerException.
Отдельно стоят Subject: PublishSubject, BehaviorSubject, ReplaySubject, AsyncSubject. Это одновременно наблюдатель и источник, горячий поток. Schedulers к эмиттерам не относятся: через subscribeOn и observeOn они задают поток исполнения.
Честно добавьте контекст: в новых Android-проектах RxJava обычно вытеснили корутины и Flow, но в legacy-коде она живёт, и умение её читать ценится.
Где спотыкаются
Называют Schedulers и Subject «видами эмиттеров». Интервьюер слышит, что кандидат путает источник данных, поток исполнения и мост между ними.
Пишут create() без setCancellable: слушатель остаётся после отписки, и экран утекает. Ошибка, отправленная после отписки, уходит в RxJavaPlugins.onError и без своего обработчика роняет приложение с UndeliverableException.
Берут Observable для одиночного запроса вместо Single и забывают очищать CompositeDisposable в onCleared() у ViewModel.