当前位置: 首页 > 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://www.dtcms.com/wzjs/309407.html

相关文章:

  • 商城开发网站怎样在网上推广自己的产品
  • 宁德企业网站建设门户网站推广方案
  • 宜昌医院网站建设seo搜索引擎
  • 厦门知名做企业网站设计的公司百度网址大全网站
  • 政府网站建设的作用百度搜索引擎的功能
  • 南京大型门户网站建设营销模式和营销策略
  • 做问卷的网站有哪些seo综合查询爱站
  • typecho移植wordpress上海seo优化
  • 燕郊网站开发介绍产品的营销推文
  • 工信部官网查询系统查询手机广西seo公司
  • 网站推广方案设计网站seo优化方案项目策划书
  • 做酱菜网站百度网站入口链接
  • 找谁做网站比较好一个企业该如何进行网络营销
  • 八大电商平台是哪几家杭州seo俱乐部
  • 厦门专业网站设计网络推广是做什么的
  • 网站建设制作设计公司佛山经典seo伪原创
  • 攸县政府门户网站廊坊关键词排名优化
  • 免费版网站建设合同上海网络推广外包
  • 佛山专业的网站建设搜索引擎营销特点是什么
  • 可以自己做免费网站吗搜索网页内容
  • 郑州做网站多少钱淘宝大数据查询平台
  • 网站布局规划怎么写天津网站排名提升
  • 后台网站模板下载国外b站视频推广网站
  • 十大高端网站建设小红书推广价目表
  • 网站设计基本流程第一步百度网址大全旧版
  • 江门网站推广设计下载手机百度最新版
  • 网站建设杭州最便宜做一个个人网站
  • 哪些网站做推广好南京seo排名扣费
  • 制作网站设计作品广告公司排名
  • java可以做企业网站吗seoul是什么意思