我正在尝试创建一个将在自己的线程上处理消息的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
本身。但是,请注意,当前已执行的任何Message
或Runnable
都不会停止,并且不会执行Looper
MessageQueue
中的所有其他Messages
或Runnables
。