如何使用 运行 在不同线程上的回调创建处理程序?

How to create handler with callbacks that run on a different thread?

我正在尝试创建一个 Handler 将在其自己的线程上处理消息

我目前正在做的是 运行在 activity 的 onCreate 部分执行此代码:

lateinit var _handler: Handler
lateinit var hThread: HandlerThread

fun setUpHandler() {
    hThread = HandlerThread("HandlerThread")
    hThread.start()
    _handler = Handler(hThread.looper, this::callback)
}

问题是,即使我使用不同线程的循环器,ui 线程上的回调 运行s。

我通过 运行ning 创建此方法对其进行了测试:

fun callback(msg: Message): Boolean {
    Log.d("Handler", "got message ${msg.what} in thread main? ${Looper.myLooper() == Looper.getMainLooper()}")
    return true
}

当我这样称呼它时:

_handler.dispatchMessage(Message.obtain(_handler, 1))

我得到:

Handler: got message 1 in thread main? true

但是当我 运行 它是这样的:

Handler(hThread.looper).post {
    val msg = Message.obtain()
    msg.what = 2
    callback(msg)
}

我收到这条消息:

Handler: got message 2 in thread main? false

我目前使用第二种方法,但出于好奇,有没有办法使第一种方法起作用?

作为附带问题,activity 的 onDestroy 方法中的 运行ning hThread.quit() 是否足以终止我启动的额外线程,或者我必须做其他事情吗?

如前所述,here dispatchMessage 函数通过 callback 在调用该函数的任何线程上运行 Message ... UI 线程就是它出现的地方。

此外,仅供参考 dispatchMessage 并没有真正使用,因为它违背了使用 Handler 并将其附加到 Thread 等的目的,正如此处完美展示的那样。

quit() 终止 Looper,这实际上终止了无限 while 循环,使 HandlerThread "alive" 保持在 run() 中方法,所以是的,它应该足以杀死 Thread 本身。但是,请注意当前已经执行的任何 MessageRunnable 都不会停止,并且 [=17 的 MessageQueue 中的所有其他 MessagesRunnables =] 不会被执行。