gpt4 book ai didi

android - 如何在主线程上使用 Kotlin 协程 await()

转载 作者:IT老高 更新时间:2023-10-28 13:35:36 26 4
gpt4 key购买 nike

我刚开始学习 Kotlin 协程,并试图通过在 UI 上显示结果来模拟一些长时间的 API 调用:

class MainActivity : AppCompatActivity() {
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")

override
fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.setContentView(R.layout.activity_main)
val resultTV = findViewById(R.id.text) as TextView

val a = async(CommonPool) {
delay(1_000L)
6
}

val b = async(CommonPool) {
delay(1_000L)
7
}

launch(< NEED UI thread here >) {
val aVal = a.await()
val bVal = b.await()
resultTV.setText((aVal * bVal).toString())
}
}
}

我不明白我怎么可能在 main 上下文中使用 launch 方法。

不幸的是,我找不到任何关于在 the official tutorial for coroutines 上为某些特定线程提供结果的信息。 .

最佳答案

编辑:

另见 an official example in Kotlin repo

您需要实现 Continuation对 Android UI 线程和 Coroutine context 进行回调的接口(interface)

例如(来自here)

private class AndroidContinuation<T>(val cont: Continuation<T>) : Continuation<T> by cont {
override fun resume(value: T) {
if (Looper.myLooper() == Looper.getMainLooper()) cont.resume(value)
else Handler(Looper.getMainLooper()).post { cont.resume(value) }
}
override fun resumeWithException(exception: Throwable) {
if (Looper.myLooper() == Looper.getMainLooper()) cont.resumeWithException(exception)
else Handler(Looper.getMainLooper()).post { cont.resumeWithException(exception) }
}
}

object Android : AbstractCoroutineContextElement(ContinuationInterceptor), ContinuationInterceptor {
override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> =
AndroidContinuation(continuation)
}

那就试试吧:

launch(Android) {
val aVal = a.await()
val bVal = b.await()
resultTV.setText((aVal * bVal).toString())
}

更多信息:

https://medium.com/@macastiblancot/android-coroutines-getting-rid-of-runonuithread-and-callbacks-cleaner-thread-handling-and-more-234c0a9bd8eb#.r2buf5e6h

关于android - 如何在主线程上使用 Kotlin 协程 await(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42561217/

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