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



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

我目前正在做的是在以下代码的活动onCreate部分运行:

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

问题是,即使我使用不同线程的循环器,回调也会在 UI 线程上运行。

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

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

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

作为一个附带问题,在活动的onDestroy方法中运行hThread.quit()是否足以终止我启动的额外线程,或者我必须执行其他操作?

正如这里提到的,dispatchMessage 函数在调用该函数的任何线程上通过callback运行Message......所以自从你从 UI 线程调用它,这就是它出现的地方。

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

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

最新更新