无法为 Retrofit2.Response<...> 创建调用适配器

kau*_*lex 3 android moshi retrofit2

我的 API:

@GET("/cinema/notShownMovies")
fun getNotShownMovies(
   @Query("token") token: String
): Response<GetMovieResponse>


@JsonClass(generateAdapter = true)
data class Movie(
    val id: Long,
    val name: String,
    val date: String,

    @field:Json(name = "trailer_link")
    val trailerLink: String?,

    @field:Json(name = "poster_link")
    val posterLink: String?,

    @field:Json(name = "booked_tickets")
    val bookedTickets: Int,

    @field:Json(name = "movie_year_id")
    val movieYearId: Int,

    @field:Json(name = "created_at")
    val createdAt: String,

    @field:Json(name = "updated_at")
    val updatedAt: String,

    @field:Json(name = "worker_id")
    val workerId: Int?,

    @field:Json(name = "worker_name")
    val workerName: String?,

    @field:Json(name = "emergency_worker_id")
    val emergencyWorkerId: Int?,

    @field:Json(name = "emergency_worker_name")
    val emergencyWorkerName: String?,

    @field:Json(name = "booked_tickets_for_yourself")
    val bookedTicketsForYourself: Int,

    @field:Json(name = "view_movie")
    val viewMovie: ViewMovie
)

@JsonClass(generateAdapter = true)
data class ViewMovie(
    val href: String,
    val method: String
)
Run Code Online (Sandbox Code Playgroud)

尝试调用 API 时出现异常:

java.lang.IllegalArgumentException:无法为方法 InstanceApi.getNotShownMovies 为retrofit2.Response<...data.GetMovieResponse> 创建调用适配器无法为方法InstanceApi.getNotShownMovies 为retrofit2.Response<...data.GetMovieResponse> 创建调用适配器

我不知道从哪里开始。所有其他 API 调用都可以正常工作,这些调用也在同一个 API 类中定义。也许是模型错误?

ric*_*ira 17

我也遇到过类似的崩溃IllegalArgumentException: Call return type must be parameterized as Call

崩溃日志:

Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for interface retrofit2.Call
    for method Api.login
    at retrofit2.Utils.methodError(Utils.java:54)
    at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:116)
    at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:67)
    at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39)
    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
    at retrofit2.Retrofit$1.invoke(Retrofit.java:160)
    at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
    at $Proxy0.login(Unknown Source)
    at <redacted>.screen.login.LoginActivity.onSignInClick(LoginActivity.java:103)
    ... 13 more
Caused by: java.lang.IllegalArgumentException: Call return type must be parameterized as Call<Foo> or Call<? extends Foo>
    at retrofit2.DefaultCallAdapterFactory.get(DefaultCallAdapterFactory.java:42)
    at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:253)
    at retrofit2.Retrofit.callAdapter(Retrofit.java:237)
    at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:114)
    ... 20 more
Run Code Online (Sandbox Code Playgroud)

我发现它崩溃是因为 Proguard/R8。Proguard 正在重命名 Retrofit 类,为了解决这个问题,我更新了 Proguard 设置:

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
Run Code Online (Sandbox Code Playgroud)


Abd*_*een 16

suspend如果使用,只需添加修饰符coroutines。这将解决问题。

否则,您的问题可能是因为在实例化Retrofit对象时没有添加 Call 适配器。例如,对于RxJava2,您可以通过在构建时添加此行来包含呼叫适配器。

.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用协程,请在函数之前包含关键字“suspend”。我还相信您只需将数据类包装在“Response”中。 (2认同)
  • 是的,这个错误消息对于识别丢失的“挂起”根本没有帮助。 (2认同)
  • 非常感谢,,,,,我已经尝试了一整天,缺少 api 函数的 *Suspend* (2认同)
  • @SuhadBinZubair 我在改造 API 调用中也遇到了同样的问题。这样做了,效果很完美。 (2认同)