Почему для Room или Retrofit легче использовать Single

Ответ

Room и Retrofit возвращают Single (из RxJava), потому что они работают с асинхронными операциями, которые выполняются один раз и завершаются либо успехом, либо ошибкой.

Преимущества:

  • Single идеально подходит для операций, которые возвращают один результат (например, запрос к API или запрос в БД).
  • Упрощает обработку ошибок через onError.
  • Четко выражает намерение: операция выполняется один раз, без потоков данных.

Пример с Retrofit:

interface ApiService {
    @GET("user/{id}")
    fun getUser(@Path("id") id: Long): Single<User>
}

// Использование
apiService.getUser(1)
    .subscribe({ user -> showUser(user) }, { error -> showError(error) })

Single лаконичнее Observable для однократных операций и не перегружает код лишней семантикой.

Ответ 18+ 🔞

А, ну это же про RxJava и Retrofit! Слушай, тут всё просто, как три копейки. Вот смотри, когда ты делаешь запрос в сеть или в базу — что происходит? Ты либо получаешь ответ, либо получаешь ошибку. Один раз и всё. Не поток какой-то бесконечный, а раз — и готово. Так вот, для этого и придумали Single. Это как раз про "один раз и всё".

Почему это, блядь, удобно?

  • Single — это как раз для таких операций, где тебе нужен один чёткий результат. Не надо городить огород с Observable, который может и десять значений выплюнуть, если захочет. Тут всё ясно: запросил пользователя — получил пользователя. Либо получил в сердцу мать ошибку 404.
  • Обработка ошибок — просто сказка. Упал запрос? Лови в onError и делай что хочешь: покажи тост, спрячь прогресс-бар, пошли всех нахуй. Всё наглядно.
  • Самое главное — намерение сразу понятно. Глянул на сигнатуру метода — Single<User> — и сразу ясно: это не поток, это разовая операция. Никакой двусмысленности, ёпта.

Вот смотри, как это в коде выглядит:

interface ApiService {
    @GET("user/{id}")
    fun getUser(@Path("id") id: Long): Single<User>
}

// Использование
apiService.getUser(1)
    .subscribe({ user -> showUser(user) }, { error -> showError(error) })

Видишь? Красота же. Не надо думать, будет ли там onNext два раза или нет. Подписался — и ждёшь один результат. Либо юзер прилетит в первый лямбда-аргумент, либо ошибка во второй. Всё, пицца готова.

По сравнению с Observable — это просто небо и земля. Зачем тащить тяжёлую артиллерию Observable, который умеет всё на свете, если тебе нужно просто один раз дернуть API? Single лаконичнее, понятнее, и в коде сразу видно, что тут не поток данных, а разовая операция. Экономия мыслетоплива, ядрёна вошь!