首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地使用Kotlin协程进行阻塞服务调用?

如何正确地使用Kotlin协程进行阻塞服务调用?
EN

Stack Overflow用户
提问于 2019-08-26 06:29:58
回答 2查看 2.9K关注 0票数 2

我正在处理一个http库(特别是一个用于进行graphql调用的库),它的API只提供阻塞调用,并且是用Java编写的。

现在,我正在用Kotlin编写我的应用程序,并使用协程程序库,这让我想知道应该如何使用协程程序进行阻塞网络调用。

所以我有一小段代码:

代码语言:javascript
运行
复制
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()的调用,同时仍然遵循结构化的并发原则(比如父子协同关系)?

EN

回答 2

Stack Overflow用户

发布于 2019-08-27 02:00:05

因为您使用的api进行阻塞调用并不一定意味着您需要遵守这一点。如果您已经在使用Kotlin协程,那么您可以很容易地使用withContext(Dispatchers.IO来要求一个函数在IO线程上运行。您绝对应该这样做,以避免挂起UI线程。

代码语言:javascript
运行
复制
    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
    }
票数 3
EN

Stack Overflow用户

发布于 2019-08-26 09:57:59

makeServiceCall函数中使用withContext(Dispatchers.IO)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57650163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档