java - e:java.lang.IllegalStateException:后端内部错误:文件外观代码生成期间出现异常(Kotlin)
问题描述
在我的 android 应用程序中,我使用suspendCoroutine将 volley(android 的 HTTP 库)回调包装在 Kotlin 协程中。
这是我的功能
private suspend fun requestManger(
url: String,
method: Int,
body: JSONObject?) = suspendCoroutine<Int> { continuation ->
val queue = Volley.newRequestQueue(applicationContext)
val request = object : JsonObjectRequest(method, url, body,
Response.Listener { response ->
Log.d(TAG, "doWork: $response")
continuation.resume(1)
},
Response.ErrorListener { error ->
Log.e(TAG, "doWork: error is", error)
continuation.resume(0)
}) {
override fun getHeaders(): MutableMap<String, String> {
val params = HashMap<String, String>()
params["Content-Type"] = "application/json"
params["Authorization"] = "$idToken"
return params
}
}
queue.add(request)
}
但是当我尝试构建它时,它给了我这个错误
e: java.lang.IllegalStateException: Backend Internal error: 文件外观代码生成期间的异常
值得注意的是,此错误仅在我使用Response.ErrorListener中的 continuation 对象时出现(即使我键入 continuation 而不调用任何方法,例如:resume、resumeWithException 等,我也会收到此错误)如果我不使用它错误消失,但我不希望我的功能在出现错误时永远挂起
解决方案
我知道现在回答这个问题为时已晚,而且我也没有很好的答案,但我现在设法得到了这个确切的错误,使用 Volley,创建一个继承自 JsonObjectRequest 的匿名对象,甚至像你一样覆盖 getHeaders。
但就我而言,我根本没有使用延续。我也不完全确定是什么修复了它,尽管我最终“修复”的问题是我创建了两个继承自 JsonObjectRequest 的对象,除了第二个是在 Response.Listener 回调中创建的。
如在代码中,它看起来有点像这样:
val request = object : JsonObjectRequest(method, url, body,
Response.Listener { response ->
...
val nestedRequest = object : JsonObjectRequest(method2, url2, body2,
Response.Listener { response ->
...
},
errorListener) {
override fun getHeaders(): MutableMap<String, String> {
...
return params
}
}
queue.add(nestedRequest)
},
errorListener) {
override fun getHeaders(): MutableMap<String, String> {
...
return params
}
}
queue.add(request)
最终工作的修复只是将嵌套对象的创建移出,并在另一个函数中完成工作。
像这样的东西:
fun doWork(response: JsonObject) {
...
val nestedRequest = object : JsonObjectRequest(method2, url2, body2,
Response.Listener { response ->
...
},
errorListener) {
override fun getHeaders(): MutableMap<String, String> {
...
return params
}
}
queue.add(nestedRequest)
}
val request = object : JsonObjectRequest(method, url, body,
Response.Listener { response ->
doWork(response)
},
errorListener) {
override fun getHeaders(): MutableMap<String, String> {
...
return params
}
}
queue.add(request)
推荐阅读
- jquery-bootgrid - 如何应用引导网格过滤器?
- python - django project_form 无效?
- r - 如何将 scale 和 dist 与具有列名的数据集一起使用
- javascript - 如何将相同的元素添加到javascript数组n次
- php - 如何配置 PhpStorm 在调试文件时通过 IIS url 重写而不是直接加载文件
- swift - 保存和加载 UIDocumentBrowserViewController
- java - Java - 2D 数组 - 不能使用增强循环?
- python - 如何通过网站上的xpath点击每个名字?
- c - 检查数组的出现次数并输出到新数组。C
- java - 列出适用于 Android API 17 及更高版本的 SIM 信息(双 SIM 卡设备)