【发布时间】:2019-04-18 23:54:45
【问题描述】:
我正在试验新的协程,并尝试将它们合并到现有项目中,并带有一些丑陋的 AndroidNetworking api 请求。
所以我当前的 api 请求正在使用这样的回调......
fun getSomethingFromBackend(callback: (response: JSONArray?, error: String?) -> Unit) {
AndroidNetworking.get(...).build().getAsJSONObject(object : JSONObjectRequestListener {
override fun onResponse(response: JSONObject) { ... }
override fun onError(error: ANError) { ... }
}
}
现在我正在尝试合并这样的协程......
fun someFunction() = runBlocking {
async { callGetSomething() }.await()
}
suspend fun callGetSomething(): JSONObject? = suspendCoroutine {
Something().getSomethingFromBackend {something
...
it.resume(something)
}
}
如您所见,我正在尝试在协程中运行 callGetSomething,然后暂停协程直到异步 API 返回。
我的问题是,它永远不会返回。即使我在onResponse、onError 等中调试,它也永远不会从后端返回。
但是如果我删除= suspendCoroutine 它可以工作,至少它会返回,但是等待不会正常工作,因为执行会继续。
我该如何解决这个问题,以便 await() 实际上等待异步调用回调?
非常感谢!
【问题讨论】:
-
你确定
getSomethingFromBackend回调总是被调用吗? -
另外,如果
someFunction和回调应该从同一个线程调用,那么它不会发生,因为你用runBlocking阻止了它
标签: android kotlin coroutine kotlinx.coroutines