gpt4 book ai didi

kotlin - 如何使用 Kotlin 协程调用阻塞函数?

转载 作者:行者123 更新时间:2023-12-02 13:03:22 24 4
gpt4 key购买 nike

我想使用 Kotlin 协程来调用阻塞函数。

例如,当对话框和网络库不提供suspend 函数。

我使用 Mutex 实现了它。

比如对于阻塞网络调用的场景,我是这样做的:

class Connection {
private val mutex = Mutex()

public suspend fun receive(): ByteArray {
mutex.lock()

val buf = ByteArray(42)

thread {
sock.getInputStream().read(buf, 0, 42) // blocking
mutex.unlock()
}

mutex.lock()

return buf
}
}

有效。

请忽略上述代码中与网络相关的问题(如错误处理、检查实际读取的字节数等)。

也请忽略使用线程的性能方面(上面的专用线程只是为了示例)。

从使用 Mutex 将阻塞流“转换”为协程流的角度来看:

  1. 是否有标准或更好的方法来执行此操作?
  2. 除了网络或性能 - 您认为我的方法有什么缺点吗?

最佳答案

你可以这样做:

suspend fun receive(): ByteArray {
return withContext(Dispatchers.IO) {
val buf = ByteArray(42)
sock.getInputStream().read(buf, 0, 42) // blocking
buf
}
}

从您的 Activity 调用它:

lifecycleScope.launch{
withContext(Dispatchers.Main) {
//showLoading
val result = receive()
//hideloading
}
}

接收函数将在 IO 分派(dispatch)器中运行,该分派(dispatch)器设计用于将阻塞 IO 任务卸载到共享线程池查看有关分派(dispatch)器的更多信息 here .

关于kotlin - 如何使用 Kotlin 协程调用阻塞函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64306381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com