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

Что такое Adapters в Retrofit?

1.8 Middle🔥 141 комментариев
#Сетевое взаимодействие

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

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

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

Что такое адаптеры (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 Coroutinessuspend функциями)
  • RxJava (Observable, Single, Flowable, Completable)
  • Guava (ListenableFuture)
  • Java 8+ (CompletableFuture)

Чтобы Retrofit мог возвращать не Call<T>, а, например, Observable<Response<User>>, и нужны адаптеры. Они "оборачивают" Call<T> в нужный тип.

Ключевые типы адаптеров

  1. CallAdapter.Factory — это фабрика, которая создает экземпляры CallAdapter. Именно ее вы указываете при создании экземпляра Retrofit через addCallAdapterFactory(). Каждый CallAdapter отвечает за адаптацию к одному конкретному типу (например, к Observable).

  2. 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. Когда вы делаете вызов метода сервиса, происходит следующее:

  1. Retrofit находит подходящий CallAdapter.Factory для типа возвращаемого значения метода (например, Observable<User>).
  2. Выбранная фабрика создает CallAdapter, который оборачивает исходный Call<ResponseBody> (еще не сконвертированный в User) в целевой тип (Observable).
  3. После этого конвертер (например, GsonConverterFactory) преобразует ResponseBody внутри этой обертки в конечный объект User.

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

Вывод

Адаптеры в Retrofit — это мощный механизм абстракции, который отделяет логику выполнения HTTP-запроса (Call) от парадигмы асинхронного программирования, используемой в клиентском коде. Они делают библиотеку невероятно гибкой, позволяя разработчикам работать в удобном для них стиле — будь то реактивное программирование с RxJava, современные корутины Kotlin или другие подходы, — сохраняя при этом всю простоту и мощь объявления API через интерфейсы.

Что такое Adapters в Retrofit? | PrepBro