gpt4 book ai didi

android - Kotlin 协程在 UI 线程上等待

转载 作者:搜寻专家 更新时间:2023-11-01 08:17:42 25 4
gpt4 key购买 nike

目前在我的代码库中,使用 Kotlin ,我有一个按以下方式工作的扩展功能。

async {
executeSomeCodeToGetResult()
}.awaitOnUiThread { result ->
useResultOnUiThread(result)
}

async函数将可运行对象加载到 ExecutorService 上返回 Future<T>结果。 awaitOnUiThreadFuture<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)
}
}
}

最佳答案

使用协同程序,您不需要任何asyncawaitOnGuiThread。您应该使用以下成语:

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/

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