首页 > 解决方案 > Retrofit 中从 AsyncTask 到 Coroutines 的转换:IllegalArgumentException

问题描述

IllegalArgumentException在从AsyncTask(之前)到Kotlin Coroutines(之后)进行最小更改时,我不断收到错误。请注意,代码与AsyncTask.

注意:改造正在调用我自己的.php脚本,该脚本返回一些以字符串SimpleResultObject编码的对象。json

变更前:

改造:

@FormUrlEncoded
@POST("activity_signup.php")
fun activitySignUp(
        @Field("activity_id") activityId: Int,
        @Field("user_id") userId: Int) : Call<SimpleResultObject> 

活动(AsyncTask 内部):

@Override
protected doInBackground(...) {

        val gson = GsonBuilder().setLenient().create()
            val retrofit = Retrofit.Builder()
                    .baseUrl(LOCALHOST_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build()

            val service = retrofit.create(RetrofitAPI::class.java)
            val call = service.activitySignUp(activity_id, userId)
            call.enqueue(Callback<SimpleResultObject>() {}

在方法中接收对象@onResponse并通常继续进行。

更改后:

改造:

 @FormUrlEncoded
 @POST("activity_signup.php")
 suspend fun activitySignUp(
            @Field("activity_id") activityId: Int,
            @Field("user_id") userId: Int): SimpleResultObject

活动:

 fun signUp() {
        myActivityScope.launch(Dispatchers.Main) {

            val gson = GsonBuilder().setLenient().create()
            val retrofit = Retrofit.Builder()
                    .baseUrl(LOCALHOST_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build()

            val service = retrofit.create(RetrofitAPI::class.java)
            try {
                val result = service.activitySignUp(specificResultObject.activityId, userId)
                } catch (t:Throwable)

在线通话java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #3) for method RetrofitAPI.activitySignUp_service.activitySignUp

注意:myActivityScopeCoroutineScope在举办活动结束时完成的服装。

我已经尝试了我能记住的一切:添加OkHttpClient、更改为MoshiConverterFactory、尝试其他 CoroutineScopes 和 Dispatchers,...

.php编辑:由于高于我的参数编号(可能是空结果?),问题可能在我这边Exeption,但不知道为什么以前有效的东西现在不起作用。

标签: androidretrofit2kotlin-coroutines

解决方案


根据对问题的回答,我对代码进行了一些修改并设法解决了这个问题。正如@Mohammad Sianaki 指出的那样,最重要的是将改造版本从 25.0.0 提高到 26.0.0 以解决问题

IllegalArgumentException因此,对于可能在参数编号上方获得 for 参数的其他所有人-考虑检查 Retrofit 版本

特别感谢所有提供帮助的人,尤其是@CommonsWare!


推荐阅读