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
函数返回。 。
我有一个非常简单的协程,它只是做了一些延迟,然后我想让它做的是 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
函数返回。