Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое адаптеры (Adapters) в Retrofit?
В Retrofit адаптеры — это компоненты, ответственные за преобразование объектов вызовов (Call objects) в другие формы, удобные для работы в различных сценариях, например, в RxJava Observables, Kotlin Coroutines или Guava ListenableFuture. По сути, адаптер является "мостом" между стандартным синхронным/асинхронным API Retrofit (Call<T>) и другими моделями асинхронного программирования или библиотеками.
Основная задача адаптеров
Retrofit по умолчанию для каждого объявленного метода HTTP-сервиса возвращает объект Call<T>. Этот объект позволяет выполнять синхронные (execute()) или асинхронные (enqueue(Callback<T>)) запросы. Однако современная разработка под Android часто использует другие механизмы:
- Kotlin Coroutines (с
suspendфункциями) - RxJava (Observable, Single, Flowable, Completable)
- Guava (ListenableFuture)
- Java 8+ (CompletableFuture)
Чтобы Retrofit мог возвращать не Call<T>, а, например, Observable<Response<User>>, и нужны адаптеры. Они "оборачивают" Call<T> в нужный тип.
Ключевые типы адаптеров
-
CallAdapter.Factory — это фабрика, которая создает экземпляры CallAdapter. Именно ее вы указываете при создании экземпляра Retrofit через
addCallAdapterFactory(). КаждыйCallAdapterотвечает за адаптацию к одному конкретному типу (например, кObservable). -
Built-in и сторонние адаптеры:
* **`retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory`** — для интеграции с RxJava 3.
* **`retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory`** — для RxJava 2.
* **`retrofit2.adapter.guava.GuavaCallAdapterFactory`** — для Guava.
* **Адаптер для Kotlin Coroutines** поставляется в отдельной зависимости `retrofit2-kotlin-coroutines-adapter` (хотя сейчас чаще используют встроенную поддержку через `suspend`-функции).
Как это работает на практике
Пример 1: Использование RxJava с адаптером
// 1. Добавляем фабрику адаптеров при создании Retrofit
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create()) // <-- Адаптер для RxJava3
.build()
// 2. Объявляем метод в интерфейсе сервиса, возвращающий Observable
interface ApiService {
@GET("user/{id}")
fun getUserRx(@Path("id") userId: Long): Observable<User> // Возвращаем не Call, а Observable!
}
// 3. Используем
val service = retrofit.create(ApiService::class.java)
service.getUserRx(123L)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ user -> showUser(user) }, { error -> handleError(error) })
Пример 2: Современный подход с Kotlin Coroutines (через suspend)
Начиная с Retrofit 2.6.0, встроенная поддержка корутин позволяет обойтись без явного добавления адаптера для базовых сценариев. Однако под капотом все равно работает специальный встроенный адаптер.
interface ApiService {
// Просто помечаем функцию как suspend. Retrofit сам адаптирует вызов.
@GET("user/{id}")
suspend fun getUserSuspend(@Path("id") userId: Long): User
}
// Использование в корутине
viewModelScope.launch {
try {
val user = service.getUserSuspend(123L) // Прямой возврат результата!
_userLiveData.value = user
} catch (e: IOException) {
// Обработка ошибок сети
} catch (e: HttpException) {
// Обработка HTTP-ошибок (404, 500 и т.д.)
}
}
Архитектурная роль и кастомизация
Адаптеры работают в цепочке преобразований Retrofit. Когда вы делаете вызов метода сервиса, происходит следующее:
- Retrofit находит подходящий
CallAdapter.Factoryдля типа возвращаемого значения метода (например,Observable<User>). - Выбранная фабрика создает
CallAdapter, который оборачивает исходныйCall<ResponseBody>(еще не сконвертированный вUser) в целевой тип (Observable). - После этого конвертер (например,
GsonConverterFactory) преобразуетResponseBodyвнутри этой обертки в конечный объектUser.
Вы можете создать свой собственный CallAdapter.Factory, если вам нужна интеграция с другой библиотекой или нестандартное поведение (например, автоматическая повторная попытка запроса или особая обработка ошибок на уровне адаптера).
Вывод
Адаптеры в Retrofit — это мощный механизм абстракции, который отделяет логику выполнения HTTP-запроса (Call) от парадигмы асинхронного программирования, используемой в клиентском коде. Они делают библиотеку невероятно гибкой, позволяя разработчикам работать в удобном для них стиле — будь то реактивное программирование с RxJava, современные корутины Kotlin или другие подходы, — сохраняя при этом всю простоту и мощь объявления API через интерфейсы.