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

时间:2019-01-03 14:02:19

标签: android android-handler

我正在尝试创建一个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足以终止我启动的额外线程,或者我必须做其他事情?

1 个答案:

答案 0 :(得分:0)

here所述,dispatchMessage函数在调用该函数的任何线程上通过Message运行callback,因此自从用户界面调用以来出现的线程。

FYI dispatchMessage并没有真正使用,因为它违反了使用Handler并将其附加到Thread等的目的,如此处完美说明的那样。

quit()终止了Looper,实际上终止了无限的while循环,实际上使HandlerThread“有效”保持在run()方法中,所以是的,就足以杀死Thread本身。但是,请注意,不会停止当前正在执行的任何MessageRunnable,并且{{1}的Messages中的所有其他RunnablesMessageQueue }}将不会执行。