← Назад к вопросам

Какие знаешь виды потоков в RxJava?

1.3 Junior🔥 113 комментариев
#Многопоточность и асинхронность

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды потоков (streams) в RxJava

В RxJava потоки представлены Observable, Flowable, Single, Maybe, Completable. Эти абстракции отличаются семантикой и сценариями применения.

Observable

Базовый тип для реактивных потоков с поддержкой backpressure-стратегий (например, onBackpressureDrop()), но без встроенного backpressure управления в подписке. Используется для потоков с известным или ограниченным объемом данных.

Observable.create<Int> { emitter ->
    emitter.onNext(1)
    emitter.onNext(2)
    emitter.onComplete()
}.subscribe(
    { value -> println(value) },
    { error -> println(error) },
    { println("Completed") }
)

Flowable

Рекомендуется для потоков с потенциально большим объемом данных или асинхронных источников. Имеет встроенную поддержку backpressure через стратегии (BUFFER, DROP, LATEST и др.).

Flowable.range(1, 1000)
    .onBackpressureBuffer()
    .observeOn(Schedulers.io())
    .subscribe { value -> process(value) }

Single

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

Single.fromCallable { 
    apiService.fetchUserData() 
}.subscribe(
    { user -> displayUser(user) },
    { error -> showError(error) }
)

Maybe

Может излучать ноль или один элемент, либо ошибку. Подходит для операций, которые могут не вернуть результат (например, поиск в кэше).

Maybe.create<Data> { emitter ->
    val cached = cache.getData()
    if (cached != null) {
        emitter.onSuccess(cached)
    } else {
        emitter.onComplete()
    }
}.subscribe(
    { data -> useData(data) },
    { error -> handleError(error) },
    { println("No data available") }
)

Completable

Не излучает данные, только сигнал о завершении или ошибке. Используется для операций, где важен факт выполнения, а не результат (например, сохранение данных).

Completable.fromAction { 
    database.clearTable() 
}.subscribe(
    { println("Table cleared") },
    { error -> println("Failed: $error") }
)

Ключевые различия

  • Backpressure: Flowable имеет явную поддержку, Observable — только через операторы.
  • Количество элементов: Single/Maybe — один или ноль, Observable/Flowable — множество.
  • Семантика: Completable — только завершение, без данных.
  • Производительность: Flowable добавляет накладные расходы на управление backpressure, поэтому для известных объемов данных предпочтительнее Observable.

Рекомендации по выбору

  1. Используйте Flowable для: потоков данных с неопределенным объемом (например, события UI, чтение файлов).
  2. Observable подходит для: ограниченных синхронных последовательностей (до 1000 элементов).
  3. Single применяйте для: сетевых запросов, где ожидается единственный ответ.
  4. Maybe выбирайте для: операций, которые могут вернуть null или пустой результат.
  5. Completable используйте для: side-effect операций (логирование, инициализация).

Понимание этих типов позволяет эффективно моделировать асинхронные потоки данных с учетом требований к обработке backpressure и семантике операций.

Какие знаешь виды потоков в RxJava? | PrepBro