【发布时间】:2019-12-02 19:58:28
【问题描述】:
在从AsyncTask(之前)到Kotlin Coroutines(之后)进行最小更改时,我不断收到错误IllegalArgumentException。请注意,AsyncTask 的代码按预期工作。
注意:Retrofit 正在调用我自己的 .php 脚本,该脚本返回一些在 json 字符串中编码的对象 SimpleResultObject。
变更前:
改造:
@FormUrlEncoded
@POST("activity_signup.php")
fun activitySignUp(
@Field("activity_id") activityId: Int,
@Field("user_id") userId: Int) : Call<SimpleResultObject>
Activity(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)
在service.activitySignUp 线路调用上抛出java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #3) for method RetrofitAPI.activitySignUp
注意:myActivityScope 是托管活动结束时结束的服装CoroutineScope。
我已经尝试了所有我能记住的方法:添加 OkHttpClient,更改为 MoshiConverterFactory,尝试其他 CoroutineScopes 和 Dispatchers,...
编辑:问题可能出在我的.php 一方,因为Exeption 高于我的参数编号(可能是空结果?),但不知道为什么以前有效的东西现在不起作用。
【问题讨论】:
-
那次崩溃是来自
retrofit.create()电话吗?如果是这样,请尝试将您的gson、retrofit和service声明/初始化移到协程之外。这些都不会在运行时发生变化,也不需要Context或任何奇怪的东西,因此您可以将它们作为包含signUp()的任何类的属性。另外,您使用的是哪个版本的 Retrofit? -
@CommonsWare 感谢您的帮助!抱歉,如果不够清楚:错误来自“service.activitySignUp”调用。我正在使用 Retrofit 2.5.0 版。我希望该错误必须来自 .php 方面,但不知道为什么它现在无法正常工作,而之前它工作得很好。
-
您仍然可以尝试将
gson、retrofit和service声明/初始化移到协程之外,以防万一。这个错误没有多大意义,因为activitySignUp()只有两个参数,所以我不知道“参数#3”是什么意思。 -
@CommonsWare 我已将所有内容移到协程之外,但问题仍然存在。无论如何,感谢您的帮助 - 希望会有人知道如何解决这个问题!
-
@Androidz 我认为是库版本的原因,因为 Retrofit 2.5.0 不支持挂起功能,您正在使用这种方式,更新到 2.6.0 应该可以解决您的问题
标签: android retrofit2 kotlin-coroutines