Ответ
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 лаконичнее, понятнее, и в коде сразу видно, что тут не поток данных, а разовая операция. Экономия мыслетоплива, ядрёна вошь!