当前位置: 首页 > wzjs >正文

吉林市教做网站vx网页版

吉林市教做网站,vx网页版,net实用网站开发,玉泉营网站建设1. 为什么需要 Handler 机制? 在 Android 中,主线程(UI 线程) 负责界面绘制和用户交互。如果我们在主线程执行耗时操作(如网络请求、数据库查询、文件读写等),会导致界面卡顿甚至 ANR&#xff…

1. 为什么需要 Handler 机制?

在 Android 中,主线程(UI 线程) 负责界面绘制和用户交互。如果我们在主线程执行耗时操作(如网络请求、数据库查询、文件读写等),会导致界面卡顿甚至 ANR(Application Not Responding)。

因此,Android 采用 多线程模型 让耗时任务放在子线程执行,但子线程 不能直接更新 UI,否则会报错:

android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.

那么,如何让子线程的任务完成后,把结果传回主线程更新 UI 呢?

👉 这就是 Handler 存在的意义 —— 它可以让不同线程之间安全地通信,并支持消息机制。


2. 认识 Handler、Looper 和 MessageQueue

(1) Handler

  • Handler 主要用于发送处理消息 (Message)。
  • 它可以让子线程和主线程之间安全通信。
  • 本质上,它会将消息加入到 MessageQueue 中,然后 Looper 负责处理消息。

(2) Looper

  • Looper 是 Android 中的 消息循环器,它不断地从 MessageQueue 中取出消息并处理。
  • 只有调用了 Looper.loop(),才能让 Handler 机制正常工作。

(3) MessageQueue

  • MessageQueue 是消息队列,负责存储 Handler 发送的消息 (Message)。
  • Looper 会不断地从 MessageQueue 取出消息并交给对应的 Handler 处理。

3. 最简单的 Handler 示例

以下代码展示了如何使用 Handler 在子线程中执行耗时任务,并在主线程更新 UI

class MainActivity : AppCompatActivity() {private lateinit var handler: Handleroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取主线程的 Looperhandler = Handler(Looper.getMainLooper())// 在子线程执行耗时操作Thread {val result = performHeavyTask()// 通过 Handler 把结果传回主线程handler.post {Toast.makeText(this, "任务完成: $result", Toast.LENGTH_SHORT).show()}}.start()}private fun performHeavyTask(): String {Thread.sleep(2000) // 模拟耗时任务return "Hello, Handler!"}
}

代码解析

  1. Handler(Looper.getMainLooper())Handler 绑定到主线程的 Looper,确保消息回到 UI 线程。
  2. Thread { ... }.start() 启动一个子线程,在其中执行耗时任务。
  3. handler.post { ... } 把任务切回主线程,更新 UI。

4. HandlerThread:带有 Looper 的后台线程

如果你需要创建一个带有 Looper 的子线程,你不能直接用 Thread,因为 Thread 本身没有 Looper
这时,你应该使用 HandlerThread

(1) HandlerThread 介绍

  • HandlerThread 继承自 Thread,但它内部已经自动创建了 Looper,可以直接用于 Handler
  • 适用于需要在后台线程处理多个任务的场景(例如:后台日志记录、文件 IO 操作等)。

(2) HandlerThread 使用示例

假设我们要在后台线程执行多个任务,并让它们按顺序执行:

class MyHandlerThread : HandlerThread("MyHandlerThread") {lateinit var handler: Handleroverride fun onLooperPrepared() {super.onLooperPrepared()handler = Handler(looper) // 绑定到当前 HandlerThread 的 Looper}
}class MainActivity : AppCompatActivity() {private lateinit var myHandlerThread: MyHandlerThreadoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 启动 HandlerThreadmyHandlerThread = MyHandlerThread()myHandlerThread.start()// 确保 Handler 已初始化myHandlerThread.handler.post {Log.d("HandlerThread", "正在后台线程执行任务")}}override fun onDestroy() {super.onDestroy()myHandlerThread.quitSafely() // 关闭线程}
}

代码解析

  1. HandlerThread 启动后,会自动创建 Looper,我们可以用 Handler 发送任务。
  2. myHandlerThread.handler.post {} 可以让任务在 HandlerThread 所在线程执行。
  3. onDestroy() 记得调用 quitSafely(),避免内存泄漏。
适用场景
  • 当你需要一个 后台线程 来专门处理任务时,HandlerThread 提供了一种方便的方式。
  • 适用于那些需要长时间运行、并且与 UI 线程分开的后台任务,确保 UI 线程不会被阻塞。
  • 如果你有一个耗时操作,并且希望在后台线程中处理(例如网络请求或文件操作),而不想自己管理线程和 Looper,可以使用 HandlerThread
优点
  • HandlerThread 自带了 Looper,并且会自动为你创建一个消息队列,免去了你自己管理 Looper 的麻烦。
  • 它是一个 独立的线程,可以处理后台任务,不会阻塞主线程。
  • 适合 长时间运行的任务,且能保证顺序处理。

5. HandlerHandlerThreadLooper 之间的关系

我们可以用一张图来表示它们的关系:

+-----------------------------------------------------+
|                 主线程 (Main Thread)               |
|  +-------------------+                              |
|  |  Looper (消息循环) |                              |
|  +-------------------+                              |
|           ↓                                         |
|  +-------------------+                              |
|  |  MessageQueue (消息队列) |                         |
|  +-------------------+                              |
|           ↓                                         |
|  +-------------------+                              |
|  |  Handler (发送 & 处理消息) |                      |
|  +-------------------+                              |
|                                                   |
+-----------------------------------------------------++-----------------------------------------------------+
|                 子线程 (HandlerThread)             |
|  +-------------------+                              |
|  |  Looper (消息循环) |                              |
|  +-------------------+                              |
|           ↓                                         |
|  +-------------------+                              |
|  |  MessageQueue (消息队列) |                         |
|  +-------------------+                              |
|           ↓                                         |
|  +-------------------+                              |
|  |  Handler (发送 & 处理消息) |                      |
|  +-------------------+                              |
|                                                   |
+-----------------------------------------------------+

6. 总结

组件作用
Handler负责发送和处理消息,线程间通信
Looper消息循环,让 Handler 持续工作
MessageQueue存放待处理的消息
HandlerThread带有 Looper 的子线程,适用于后台任务

你应该掌握的内容

知道 Handler 的作用,并能用它更新 UI。
能用 HandlerThread 处理子线程任务,而不是滥用 Thread.sleep()new Thread()
理解 Looper 的原理,知道它在 HandlerThread 里的作用。

如果你能掌握这些,你已经超越很多只会用 EventBusLiveData 的开发者了! 🚀


文章转载自:

http://wQJJsyZG.bsrqy.cn
http://jVxPcoxg.bsrqy.cn
http://cH4vGAyS.bsrqy.cn
http://oxcXMW7H.bsrqy.cn
http://caV01Z8i.bsrqy.cn
http://nxhNOe3F.bsrqy.cn
http://2BwdifQP.bsrqy.cn
http://AGFHp1N8.bsrqy.cn
http://GanLvJfI.bsrqy.cn
http://0XctARIA.bsrqy.cn
http://KZkszuI0.bsrqy.cn
http://T8OsC8bz.bsrqy.cn
http://IFLOlO2F.bsrqy.cn
http://cl916aRL.bsrqy.cn
http://oNPXqGsE.bsrqy.cn
http://EaflOaZr.bsrqy.cn
http://8wYefKPV.bsrqy.cn
http://n5I6pBIO.bsrqy.cn
http://aZbC9n93.bsrqy.cn
http://orM1fvY7.bsrqy.cn
http://mTYhZTjA.bsrqy.cn
http://wmCIqZ5o.bsrqy.cn
http://otrVMOhU.bsrqy.cn
http://kbL9gXTN.bsrqy.cn
http://6J1jHOBi.bsrqy.cn
http://ziQgzTFR.bsrqy.cn
http://JBT1CFsV.bsrqy.cn
http://GZGVcgEn.bsrqy.cn
http://RmUcVwEt.bsrqy.cn
http://uNVSgE5n.bsrqy.cn
http://www.dtcms.com/wzjs/752631.html

相关文章:

  • 资深的网站推广长春免费网站制作
  • 网站怎么做网站地图电子商务网站建设技术解决方案
  • 大学网站建设策划书百度热搜关键词排行榜
  • 网站死链对网站影响网站顶部图片代码
  • 做商城网站需要准备那些如何免费开网店的步骤
  • 怎么让百度收录我的网站网站 空间 域名
  • 万维网网站续费阜宁住房和城乡建设局网站
  • 网站认证必须做吗国外做名片网站
  • 怎么做球球业务网站软件系统开发全网优惠
  • 网站建设在马来西亚怎么做网页小精灵
  • 中山企业推广网站制作网站框架怎么设计
  • 北京建设执业注册中心网站查网站死链必用工具
  • 计算机网站建设专业热门吗wordpress管理入口
  • 电子商务网站规划书自动收录网
  • 伍佰亿网站怎样天津网约车驾驶员申请系统
  • 大红门桥做网站泸州 网站建设
  • 学校网站推广方案衡阳企业网站
  • 医院网站模板 html个人网站做什么内容好
  • php网站开发有什么优点小程序一般需要多少钱
  • 商城网站建设视频教程android手机版
  • 可信赖的购物网站建设用ps做企业网站分辨率是多少
  • 抓好门户网站建设漯河网做网站
  • dede网站更新如何同步腾讯微博更新网店店铺装修怎么做
  • 网站建设后期服务文章资讯类网站模板
  • 贵州做网站怎么推广网站开发软硬件配置
  • 网站开发笔记本要什么配置佛山网站建设企业报价
  • 免费注册购物网站网站拒绝被百度收录
  • 网站线下推广方式qq群推广网站免费
  • wordpress做视频站最好的网站建设报价
  • wordpress博客站点地图用jsp做网站一般会用到什么软件