我正在尝试创建一个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
我目前正在使用第二种方法,但是出于好奇,有没有办法使第一种方法起作用?
作为附带的问题,是否在活动的hThread.quit()
方法中运行onDestroy
足以终止我启动的额外线程,或者我必须做其他事情?
答案 0 :(得分:0)
如here所述,dispatchMessage
函数在调用该函数的任何线程上通过Message
运行callback
,因此自从用户界面调用以来出现的线程。
FYI dispatchMessage
并没有真正使用,因为它违反了使用Handler
并将其附加到Thread
等的目的,如此处完美说明的那样。
quit()
终止了Looper
,实际上终止了无限的while
循环,实际上使HandlerThread
“有效”保持在run()
方法中,所以是的,就足以杀死Thread
本身。但是,请注意,不会停止当前正在执行的任何Message
或Runnable
,并且{{1}的Messages
中的所有其他Runnables
或MessageQueue
}}将不会执行。