首页 > 解决方案 > 为什么可以使用在后台线程中创建的 Handler 来更新 UI?

问题描述

我有一个工人类,其中创建了一个处理程序。当我尝试使用在后台线程中创建的处理程序更新我的 UI 时,它会更新 UI,并且这里没有崩溃。理想情况下,它应该在后台线程中运行时崩溃。请在下面找到代码:

class WorkerThread(val mainThreadHandler: Handler, handlerThreadName: String) :
  HandlerThread(handlerThreadName) {

  lateinit var workerThreadHandler: Handler

override fun onLooperPrepared() {
    super.onLooperPrepared()
    Log.d("LLoyd", "onLooperPrepared")


}


override fun run() {
    super.run()
    Log.d("LLoyd", "run method called")

}

fun startTask(){
    workerThreadHandler = object : Handler(this.looper) {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            Log.d(
                "Lloyd",
                "Message from Main Thread received " + msg.what + "  Thread name  " + 
currentThread().name
            )
            val message = Message()
            message.what = msg.what
            mainThreadHandler.sendMessage(message)
        }
    }

 }
}

此 startTask() 在单击按钮时从活动中调用,如下所示:

val workerThread = WorkerThread(mainThreadHandler, "Lloyd")
    workerThread.start()
    btn_task1.setOnClickListener {
        workerThread.startTask()
        val message = Message()
        message.what = FROM_MAINTHREAD
        workerThread.workerThreadHandler.sendMessage(message)
        val message1 = Message()
        message.what = 55
        Log.d("Lloyd ", "Outside Thread name " + Thread.currentThread().name)

        workerThread.workerThreadHandler.post {
            Log.d("Lloyd ", "Runnable Thread name " + currentThread().name)
            btn_task1.text = "Task 2"
            tv.text= "YAAAAAAAAAAAAAAAAAAAAAAy"
        }
    }

任何形式的帮助表示赞赏!

标签: androidmultithreading

解决方案


当您将 Handler 连接到 UI 线程时,处理消息的代码将在 UI 线程上运行。

取自文档

我相信因为你是workerThread.startTask()从按钮单击调用的,它是 UI 线程,处理程序也只是将结果返回给 UI 线程,这就是 UI 也会更新的原因


推荐阅读