如何在Kotlin中将消息从一个线程发送到MainThread?

时间:2019-01-18 07:25:43

标签: java kotlin

我想知道我们如何将消息从一个线程发送到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中实现这种线程通信?

2 个答案:

答案 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返回。