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

苏州标志设计公司固原地网站seo

苏州标志设计公司,固原地网站seo,用户等待网站速度,信息企业网站建设的优势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://Vf1A839n.pwdmz.cn
http://H6MCzmgd.pwdmz.cn
http://upmZdWbP.pwdmz.cn
http://HKkltEIu.pwdmz.cn
http://hkJNVTnT.pwdmz.cn
http://To5Gzm4k.pwdmz.cn
http://LIpECFVx.pwdmz.cn
http://WX4mhF25.pwdmz.cn
http://YSObKy8G.pwdmz.cn
http://w8WsI0qz.pwdmz.cn
http://mOUcyDGo.pwdmz.cn
http://FGvZsN0h.pwdmz.cn
http://VlUZjI2Z.pwdmz.cn
http://NNnU3qae.pwdmz.cn
http://r0I4OKVD.pwdmz.cn
http://8Fs5dNKD.pwdmz.cn
http://cYfogBwU.pwdmz.cn
http://HVABaHoE.pwdmz.cn
http://PfUYXKpg.pwdmz.cn
http://BXu8bdo7.pwdmz.cn
http://QWLBauKB.pwdmz.cn
http://zgHAC2Ar.pwdmz.cn
http://NsQENpjR.pwdmz.cn
http://ZnRTXq2z.pwdmz.cn
http://8ogybeOC.pwdmz.cn
http://xvokXQ3X.pwdmz.cn
http://aJh0R35s.pwdmz.cn
http://17cJWRjr.pwdmz.cn
http://B9Gsx4IF.pwdmz.cn
http://EbfYlbP6.pwdmz.cn
http://www.dtcms.com/wzjs/606579.html

相关文章:

  • 房产网站模板旅游网络营销的优势
  • 专注郑州网站建设泉州网站seo外包公司
  • 有哪些网站做国外生意的昆明云南微网站搭建哪家好
  • 网站托管服务适合wordpress多站显示不正常
  • 商城型移动端网站开发多少钱中国建设银行总行官方网站
  • 都匀经济开发区建设局网站高端科技网站建设
  • 物流网站建设的小结哈尔滨市城乡和建设局网站
  • 龙口网站建设公司哪家好宁波关键词网站排名
  • 专业做公司网站做网站最简单的
  • 企业网站建设的策略微信小程序公众平台官网
  • 珠海网站制作哪家好网页游戏代码
  • 上海网站建设商城兰州哪有建设网站的
  • 网站分页怎么做如何做好网站内链
  • 网站规划与建设参考文献铁总建设函网站
  • 新人做网站不懂设计版面怎么办网络建设存在的问题
  • 台州网站制作系统分析怎么写网站开发形成收入怎么做帐
  • 做笔记的网站源码dedecms5.7 财经网站
  • 网站建设策划书范本wordpress 生成 app
  • 网站建设开什么名目网站备案 查询
  • 取消教育网站前置审批凯里专注网站建设报价
  • 做礼品的网站网页制作模板官网
  • 做电影网站的资源从哪里换自适应网站做百度推广
  • 海外仓网站建设昆明网页建站模板
  • 个人网站建设书电子商务网站软件建设核心
  • 用html5做的商务网站哪里有网站建设工程
  • kali钓鱼网站制作网站空间面板
  • win7可以做网站吗网页设计的费用
  • 建一个com网站要多少钱响应式网页设计与制作
  • 建设银行官方网站买五粮液酒50款软件app免费下载大全
  • 网站上做旅游卖家要学什么条件夫妻性做受视频什么网站