【发布时间】:2018-12-12 04:32:56
【问题描述】:
我想用 Kotlin(v1.3.0) coroutines & java.nio.channels.SocketChannel (NIO) 替换 Socket connect (blocking IO) in安卓。因为这样可以节省很多线程。
下面的代码无法运行,因为job.await() 在 Kotlin 中是挂起函数,它只能在 Ktolin 协程块中调用。比如launch{..}、async{..}。
// this function will be called by Java Code
fun connect(address: InetSocketAddress, connectTimeout: Int): SocketChannel {
// Start a new connection
// Create a non-blocking socket channel
val socketChannel = SocketChannel.open()
socketChannel.configureBlocking(false)
// async calls NIO connect function
val job = GlobalScope.async(oneThreadCtx) {
aConnect(socketChannel, address)
}
// I what to suspend(NOT block) current Java Thread, until connect is success
job.await()
return socketChannel
}
但是,我尝试使用runBlocking{..} 使这个函数成为Java 中的普通函数。但是job.await 阻止了当前的 Java 线程,不暂停。
那么,我应该如何使用 Kotlin(v1.3.0) 协程实现这个功能?
【问题讨论】:
-
正在进行的工作可能会给你一些想法:github.com/square/okio/compare/jwilson.1101.coroutines
-
@JesseWilson 现在准备好生产了吗?
-
不,还没有准备好生产。
标签: android kotlin okhttp kotlinx.coroutines socketchannel