kotlin 协程 - 如何确保在协程内部调用 UI 主线程上的一些命令 运行?

kotlin coroutine - how to ensure some commands run on UI main thread when invoked inside coroutine?

我有一个非常简单的协程,它只是做了一些延迟,然后我想让它做的是 post 命令到 UI 消息队列。所以 运行 UI 线程的最后两行。这是协程:

async{
    delay(5000)
    doSomething()
    doAnotherThing()
}

我想要 UI 线程上的最后两个方法 doSomething() 和 doAnotherThing() 到 运行?如何才能做到这一点 ?从我读到的延迟(5000)将自动异步 运行 但是如何在 UI 线程上制作其余的 运行 ?非常清楚,我正在从一个从主线程启动的对象中执行此操作。

async 在协程上下文中创建协程和 运行s,继承自 CoroutineScope,可以使用上下文参数指定其他上下文元素。如果上下文没有任何调度程序或任何其他 ContinuationInterceptor,则使用 Dispatchers.Default

如果使用 Dispatchers.Default 那么无论您在 async 构建器中调用什么函数,它都会 运行 异步。要切换上下文,您可以使用 withContext 函数:

async {
    delay(5000)
    withContext(Dispatchers.Main) {
        // if we use `Dispatchers.Main` as a coroutine context next two lines will be executed on UI thread.
        doSomething()
        doAnotherThing()
    }
}

如果 async 运行 在 Dispatchers.Main 上下文中则不需要切换上下文:

var job: Job = Job()
var scope = CoroutineScope(Dispatchers.Main + job)

scope.async {
    delay(5000) // suspends the coroutine without blocking UI thread

    // runs on UI thread
    doSomething() 
    doAnotherThing()
}

注意async主要用于并行执行。要启动一个简单的协程,使用 launch 构建器。因此,您可以将这些示例中的所有 async 函数替换为 launch 函数。 此外,对于 运行 与 async 构建器的协程,您需要在 Deferred 对象上调用 await() 函数,该对象由 async 函数返回。