作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
目前在我的代码库中,使用 Kotlin
,我有一个按以下方式工作的扩展功能。
async {
executeSomeCodeToGetResult()
}.awaitOnUiThread { result ->
useResultOnUiThread(result)
}
async
函数将可运行对象加载到 ExecutorService
上返回 Future<T>
结果。 awaitOnUiThread
是 Future<T>
上的扩展函数发送 T
的对象作为输入函数的参数。
我想知道是否有办法使用 Kotlin
coroutines
达到类似的结果?
我确实实现了类似的东西,但我没有获得很好的性能结果。也许我在运行 await()
时做错了什么GlobalScope
上的函数?
private const val threadPoolSize = 4
@ObsoleteCoroutinesApi
val scope = CoroutineScope(newFixedThreadPoolContext(threadPoolSize, "async-runner"))
@ObsoleteCoroutinesApi
fun <T> async(function: () -> T): Deferred<T> {
return scope.async { function() }
}
fun <T> Deferred<T>.awaitOnUiThread(function: (T) -> Unit) {
val deferred = this
GlobalScope.launch {
val result: T = deferred.await()
Handler(Looper.getMainLooper()).post {
function(result)
}
}
}
最佳答案
使用协同程序,您不需要任何async
和awaitOnGuiThread
。您应该使用以下成语:
launch(Dispatchers.Main) {
val result = withContext(Dispatchers.IO) {
executeSomeCodeToGetResult()
}
... just keep using the result
}
至少这是一个粗略的初步估计。 Kotlin 的协程系统还希望您明确处理失败和取消。本主题的名称为 structured concurrency .最好的起点是 ViewModel
,因为它有 built-in support用于结构化并发。
关于android - Kotlin 协程在 UI 线程上等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371273/
我是一名优秀的程序员,十分优秀!