我正在处理一个http库(特别是一个用于进行graphql调用的库),它的API只提供阻塞调用,并且是用Java编写的。
现在,我正在用Kotlin编写我的应用程序,并使用协程程序库,这让我想知道应该如何使用协程程序进行阻塞网络调用。
所以我有一小段代码:
class DataService(val client: Client) {
suspend fun getData(request: Request) {
// process request
client.makeServiceCall(...)
//deal with response
}
}
class Client() {
suspend fun makeServiceCall(...) {
library.query(....) //make a network call using the above mentioned library
}
}所以我想知道Client.makeServiceCall()是否应该被标记为挂起函数,因为它实际上不是挂起的,它只是在进行网络调用时阻塞。我应该如何进行从DataService.getData()到makeServiceCall()的调用,同时仍然遵循结构化的并发原则(比如父子协同关系)?
发布于 2019-08-27 02:00:05
因为您使用的api进行阻塞调用并不一定意味着您需要遵守这一点。如果您已经在使用Kotlin协程,那么您可以很容易地使用withContext(Dispatchers.IO来要求一个函数在IO线程上运行。您绝对应该这样做,以避免挂起UI线程。
suspend fun makeServiceCall(...) = withContext(Dispatchers.IO) {
// This code now executes on a background thread and will not block the UI
library.query(....) //make a network call using the above mentioned library
}发布于 2019-08-26 09:57:59
在makeServiceCall函数中使用withContext(Dispatchers.IO)
https://stackoverflow.com/questions/57650163
复制相似问题