我想知道我们如何将消息从一个线程发送到kotlin中的主线程。 ps:不在android上。我不想要任何特定于Android平台的答案。
我已经在android平台上尝试过此操作
private val uiThreadHandler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
(msg.obj as () -> Unit)()
}
}
并将其用作
uiThreadHandler.obtainMessage(0, block).sendToTarget()
我想在普通的Kotlin上实现这一目标。如何在Kotlin中实现这种线程通信?
答案 0 :(得分:0)
Kotlin中的简单方法是使用协程并挂起函数
class YourClass : CoroutineScope {
// context for main thread
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + Job()
fun toDoSmth() {
launch {
withContext(Dispatchers.IO) {
// task(1) do smth in another thread
}
// do smth in main thread after task(1) is finished
}
}
}
也请阅读有关分派器的信息
答案 1 :(得分:0)
消息处理严格与 Android 连接。但是您实际上并不希望向处理程序发送消息。您实际上只在该线程上运行代码。因此,您不必拨打电话即可使用post(Runnable)
:
val uiThreadHandler = Handler(Looper.getMainLooper())
uiThreadHandler.post {
...
}
要进一步抽象,您可以将Kotlin Coroutines与 Android 扩展名用于Dispatchers.Main
:
GlobalScrope.launch(Dispatchers.Main) {
...
}
然后将在 Android 主线程上调度该块。如果您没有在块本身中挂起任何东西(可能是由于您现在不使用协程),那么您可能不必担心取消{{ 1}}从Job
返回。