android - 为什么可以使用在后台线程中创建的 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"
}
}
任何形式的帮助表示赞赏!
解决方案
当您将 Handler 连接到 UI 线程时,处理消息的代码将在 UI 线程上运行。
取自文档
我相信因为你是workerThread.startTask()
从按钮单击调用的,它是 UI 线程,处理程序也只是将结果返回给 UI 线程,这就是 UI 也会更新的原因
推荐阅读
- java - 在 AuthenticationEntryPoint 中捕获从 OncePerRequestFilter 的子类抛出的自定义异常
- python - 我的函数只返回文件中的一行,而不是给出文件中的所有行
- java - Micronaut map empty Flowable 到 404
- linux - Yocto 使用一个配方文件启用多个 systemd 服务
- c# - 如何检查我的计算机上是否正在使用 C# 运行关闭进程?
- javascript - “TypeError: undefined is not an object (evalating '_expo.default.Font')]”在异步加载字体时遇到此错误
- c# - 如何在不获得锁定响应的情况下继续使用 TPM 签署数据?
- swift - 展开为时间戳时文档时间戳字段抛出错误
- terminal - zsh 不更新 vcs_info
- java - 如何从 json 数组中读取特定的 json 对象元素?