Какой источник из RxJava подходит для запроса, когда важен только факт успеха или ошибки, а данные не нужны
Что проверяют
Знаете ли вы пять базовых типов RxJava и выбираете ли тип по числу событий, а не заворачиваете всё в Observable по привычке. Следом часто спрашивают, как из Completable перейти к следующему шагу и что будет с ошибкой, если не передать обработчик.
Как отвечать
Ответ: Completable. Он не несёт значений и завершается одним из двух сигналов: onComplete или onError. Типичные случаи на Android: логаут, отправка аналитики, запись в Room, POST без полезного тела в ответе.
Покажите, что знаете соседей и умеете объяснить выбор:
Single<T>: ровно одно значение или ошибка, классика для GET-запроса;Maybe<T>: значение, пустое завершение или ошибка, например поиск в кеше;Observable<T>иFlowable<T>: поток значений, второй с поддержкой backpressure;Completable: только факт завершения.
Практика: Retrofit с RxJava3CallAdapterFactory возвращает Completable прямо из интерфейса API, тело ответа отбрасывается, а код 4xx или 5xx приходит как HttpException в onError. Room с артефактом room-rxjava3 возвращает Completable из @Insert, @Update, @Delete. Свой код оборачивают в Completable.fromAction { }, а из Single получить Completable можно через ignoreElement().
Цепочка выглядит так: api.logout().andThen(dao.clear()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()). Подписку кладут в CompositeDisposable и очищают в onCleared() у ViewModel. Честно добавьте, что в новом коде на Kotlin ту же задачу решает suspend fun, возвращающая Unit, но в проектах на RxJava Completable остаётся нормой.
Где спотыкаются
Возвращают Single<Boolean>, который всегда true, или Observable<Unit>. Тип перестаёт честно описывать контракт, а ошибка всё равно идёт через onError.
Пишут andThen(Single.just(loadUser())). loadUser() выполнится сразу при сборке цепочки, ещё до завершения Completable. Нужен Single.defer { ... } или Single.fromCallable.
Подписываются через subscribe() без обработчика ошибки. Ошибка уходит в RxJavaPlugins.onError как OnErrorNotImplementedException, и без глобального обработчика приложение падает.