You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit2报错:无法为List<MarsPhoto>创建Call适配器的解决方法

解决Retrofit2中无法创建Call Adapter的错误(非协程方案)

错误原因

你直接让接口方法返回List<MarsPhoto>,但Retrofit默认需要用它的Call<T>类型来包裹返回结果——非协程模式下,Retrofit找不到能直接处理集合类型的Call适配器,因此抛出该异常。

解决方案步骤

1. 修改API接口的返回类型

把MarsApiService里的getPhotos方法返回值改成Call<List<MarsPhoto>>,示例代码:

import retrofit2.Call
import retrofit2.http.GET

interface MarsApiService {
    @GET("photos") // 替换为你的实际API路径
    fun getPhotos(): Call<List<MarsPhoto>>
}

2. 确认Retrofit实例配置正确

确保已添加kotlinx.serialization转换器及相关依赖:

依赖配置(build.gradle.kts/build.gradle)

// Retrofit核心依赖
implementation("com.squareup.retrofit2:retrofit:2.9.0")
// kotlinx.serialization转换器
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0")
// kotlinx.serialization核心库
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")

Retrofit构建代码

import retrofit2.Retrofit
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType

val json = Json { ignoreUnknownKeys = true } // 忽略JSON中未定义字段,避免解析失败
val retrofit = Retrofit.Builder()
    .baseUrl("https://your-api-base-url.com/") // 替换为你的API基地址
    .addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
    .build()

val marsApiService = retrofit.create(MarsApiService::class.java)

3. 发起异步请求获取响应

使用Call的enqueue方法处理异步回调(避免阻塞主线程):

marsApiService.getPhotos().enqueue(object : retrofit2.Callback<List<MarsPhoto>> {
    override fun onResponse(call: Call<List<MarsPhoto>>, response: retrofit2.Response<List<MarsPhoto>>) {
        if (response.isSuccessful) {
            val photos = response.body()
            // 处理获取到的照片列表数据
        } else {
            // 处理HTTP状态码非2xx的请求失败场景
        }
    }

    override fun onFailure(call: Call<List<MarsPhoto>>, t: Throwable) {
        // 处理网络错误或请求异常
        t.printStackTrace()
    }
})

关键注意点

  • 非协程模式下,Retrofit接口方法必须用Call<T>包裹返回类型,不能直接返回实体类或集合。
  • 确保你的MarsPhoto类已添加@Serializable注解:
import kotlinx.serialization.Serializable

@Serializable
data class MarsPhoto(
    val id: String,
    val img_src: String,
    // 其他字段根据API返回结构定义
)

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:05:04