如何使用 运行 在不同线程上的回调创建处理程序?
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
本身。但是,请注意当前已经执行的任何 Message
或 Runnable
都不会停止,并且 [=17 的 MessageQueue
中的所有其他 Messages
或 Runnables
=] 不会被执行。
我正在尝试创建一个 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
本身。但是,请注意当前已经执行的任何 Message
或 Runnable
都不会停止,并且 [=17 的 MessageQueue
中的所有其他 Messages
或 Runnables
=] 不会被执行。