Я пытаюсь создать Handler
, который будет обрабатывать сообщения в своем собственном потоке
То, что я сейчас делаю, выполняется во время части действия onCreate
этого кода:
lateinit var _handler: Handler
lateinit var hThread: HandlerThread
fun setUpHandler() {
hThread = HandlerThread("HandlerThread")
hThread.start()
_handler = Handler(hThread.looper, this::callback)
}
проблема в том, что, хотя я использую петлитель другого потока, обратный вызов выполняется в потоке пользовательского интерфейса.
Я проверил это, запустив создание этого метода:
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
, чтобы завершить дополнительный поток, который я запустил, или мне нужно сделать что-то еще?