我有一个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)
}
当compile时,抛出下一个错误:
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
您可以使用gradlew assembleDebug --stacktrace --debug
来查找特定错误的原因。
此外,您可以尝试升级kotlin的版本以再次编译程序