深度分析Android Handler消息传递机制
一、 引子:UI线程的“小暴脾气”与广告牌的诞生
想象一下,你正在一个超流畅的App里滑动屏幕,突然,画面一卡,整个应用直接罢工,弹出一个“应用未响应”的提示……是不是想砸手机?这就是触犯了Android世界的第一天条:绝对不要在UI线程(主线程)执行耗时操作!
UI线程,顾名思义,就是负责处理和更新用户界面的“老大”。它是个急性子,要求所有界面操作都必须快速完成。如果你让它在主线程里执行网络请求、读取大文件,或者像咱们今天要做的——让广告牌的文字无限循环轮播,它就会被“阻塞”。它一不爽,整个界面就“冻住”了,用户怎么点都没反应,最终结果就是ANR崩溃。
那怎么办呢?“惹不起,咱躲得起”——开个新线程去干这些脏活累活呗!
但问题又来了:Android规定,只有UI线程才能触摸和更新界面。这就好比,后台小弟(新线程)辛辛苦苦把货搬来了,但不能直接放进前台(UI)的橱窗里,他得找个“传话员”去告诉前台经理该换展示品了。
这个伟大的“传话员”,就是咱们今天的主角——Handler。
我们的目标:打造一个如图所示的电子广告牌,文字自动、平滑地轮播,同时主界面操作依然流畅得飞起。
二、 Handler核心机制:解剖Android的“消息快递系统”
别被“机制”俩字吓到,咱们把它想象成一个公司里的快递系统,秒懂!
- Looper(循环器/仓库管理员):每个线程想收快递(消息),都得先雇一个Looper。它的工作就是死循环,不停地检查自己的“仓库”——MessageQueue里有没有新快递。UI线程天生就自带一个Looper,所以它能直接使用Handler。而我们开的新线程,如果想收消息,就得手动调用
Looper.prepare()和Looper.loop()来请这位管理员。 - MessageQueue(消息队列/仓库):一个先进先出的队列,专门用来存放Message。Looper就是从这个仓库里一件一件地取快递。
- Message(消息/快递包裹):这就是传递信息的基本单位。一个Message里可以装很多东西:
what(标识码,像快递单号)、arg1、arg2(整型数据)、obj(一个Object对象,比如字符串),等等。 - Handler(处理者/快递小哥+业务员):这是咱们程序员直接打交道的对象。它有两项绝活:
-
- 送快递(Send Message):可以在任何线程(比如后台线程)调用
handler.sendMessage(msg),把消息扔到它关联的那个线
- 送快递(Send Message):可以在任何线程(比如后台线程)调用

最低0.47元/天 解锁文章
2135

被折叠的 条评论
为什么被折叠?



