我有一个android项目,在kotlin中有一个util类来做所有的网络请求,这件事,我做了另一个助手类来管理请求的响应。
接口Session
interface Session : Serializable {
suspend fun <T> withSession(callback: suspend (headers: Map<String, String>) -> ApiResponse<T>): T
suspend fun refreshSession(params: HashMap<String, String>)
}接口Session的实现
class ApiSession(
token: String,
private val refreshToken: String) : Session {
private val headers: HashMap<String, String> = HashMap()
init {
headers["Authorization"] = "Bearer $token"
}
override suspend fun <T> withSession(callback: suspend (headers: Map<String, String>) -> ApiResponse<T>): T {
val response = callback(headers)
if (response.ok)
return response.data
//TODO: Retry connection or exception
return response.data
}
override suspend fun refreshSession(params: HashMap<String, String>) {
TODO("Not yet implemented")
}
}SuccessCallback定义:
typealias SuccessCallback<T> = (response: T?) -> T问题出在帮助器类NetworkFunnel的下一个方法上,
其中,requestQueue是一个Volley.newRequestQueue(context)对象
当我有这个的时候:
private suspend fun <T : Jsonable<T>> requestWithSession(session: Session, url: String, method: Int, body: JSONObject?, clazz: Class<T>, onSuccess: SuccessCallback<T>): T {
val response = session.withSession { headers ->
return@withSession suspendCoroutine<ApiResponse<T>> { cont ->
val req = object : JsonObjectRequest(method, url,
body ?: JSONObject(),
{response ->
val instance = clazz.newInstance()
val apiResponse = ApiResponse(true, instance.fromJsonObject(response))
cont.resume(apiResponse)
},
{error ->
}
) {
override fun getHeaders() = headers
}
requestQueue.add(req)
}
}
return onSuccess(response)
}编译时,抛出下一个错误:
e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: wrong bytecode generated但是当我像这样分发上面的方法时:
private suspend fun <T : Jsonable<T>> requestWithSession(session: Session, url: String, method: Int, body: JSONObject?, clazz: Class<T>, onSuccess: SuccessCallback<T>): T {
val response = session.withSession { headers ->
return@withSession suspendCoroutine<ApiResponse<T>> { cont ->
val req = parseResponse(cont, headers, url, method, body, clazz)
requestQueue.add(req)
}
}
return onSuccess(response)
}
private fun <T : Jsonable<T>> parseResponse(cont: Continuation<ApiResponse<T>>, headers: Map<String ,String>, url: String, method: Int, body: JSONObject?, clazz: Class<T>): JsonObjectRequest {
return object : JsonObjectRequest(method, url,
body ?: JSONObject(),
{response ->
val instance = clazz.newInstance()
val apiResponse = ApiResponse(true, instance.fromJsonObject(response))
cont.resume(apiResponse)
},
{error ->
}
) {
override fun getHeaders() = headers
}
}一切都很顺利,请求也按预期进行了,有人知道这里发生了什么吗?我很迷茫..。
我使用的是kotlin版本的1.3.72
发布于 2021-05-25 19:31:54
您可以使用gradlew assembleDebug --stacktrace --debug找出具体错误的原因。
此外,您可以尝试升级kotlin的版本以重新编译该程序
https://stackoverflow.com/questions/67686699
复制相似问题