首页 > 解决方案 > 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 等,我也会收到此错误)如果我不使用它错误消失,但我不希望我的功能在出现错误时永远挂起

标签: javaandroidkotlinkotlin-coroutines

解决方案


我知道现在回答这个问题为时已晚,而且我也没有很好的答案,但我现在设法得到了这个确切的错误,使用 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)

推荐阅读