嘿,各位撸码壮士和程序媛们!今天咱们不聊风花雪月,来聊点Android里“保命”的东西。你有没有遇到过这种尴尬:兴高采烈地写了个网络请求,结果一点按钮,App直接卡死三秒,然后弹出一个“Application Not Responding”(ANR)的无情嘲讽?
如果有,别慌,你不是一个人。这个问题的根源,十有八九是你动了不该动的“奶酪”——主线程。
一、主线程:“朕”很忙,摸鱼者诛!
Android的主线程(也叫UI线程),那可是个身兼数职的“大忙人”。它主要负责处理所有和用户交互相关的事情:点击、滑动、绘制页面、刷新UI……可以说,所有你眼睛能看到、手指能摸到的,都归它管。
正因为如此,这位“皇上”日理万机,最忌讳的就是被人“堵在路上”。如果你在它身上执行一个耗时操作,比如下载图片、读取大文件、复杂计算,那就好比让皇帝亲自去驿站给你送快递。在这期间,整个朝廷(你的App)就停摆了,用户点哪都没反应。
结果呢?轻则卡顿,用户体验像坐上了拖拉机;重则ANR,系统直接帮你把App给“咔嚓”了。
那么问题来了:活儿总得有人干啊,这些耗时任务谁来处理?答案就是:开子线程(后台工人)去干!
二、天团登场:Handler, Looper, MessageQueue 的“铁三角”
子线程干完活,总得把结果告诉主线程,让主线程来更新UI吧?比如下载完一张图片,你得告诉ImageView:“喂,图来了,显示一下!”
但这里有个天条:严禁子线程直接修改UI! 为啥?因为UI控件不是“线程安全”的,如果主线程和子线程同时去改一个TextView,很容易造成数据错乱,界面显示鬼畜。
于是,Android为我们设计了一套优雅的“传纸条”机制,这就是我们今天的主角——Handler-Looper-MessageQueue 铁三角。
你可以把它们想象成一个高效的公司工作流程:
- Message(纸条):上面写着“干什么事”(
what)和“需要什么材料”(obj)。比如一张纸条写着:“老哥,把这个图片设置到那个ImageView上。” - MessageQueue(纸条筐):一个先进先出的队列。所有写好的Message都按顺序扔进这个筐里,等着被处理。
- Looper(循环者/监工):一个任劳任怨的“监工”,它的工作简单到枯燥:不停地从MessageQueue里掏纸条。有纸条就拿出来;没纸条就眯一会儿(阻塞),等有新纸条来了再继续掏。它就是整个机制的“心脏”,保证消息循环能一直转下去。
- Handler(递纸条的人和干活的人):它有两重身份。
-
- 子线程中的它:负责写纸条(创建Message)和往筐里扔纸条(
sendMessage)。 - 主线程中的它:负责处理纸条(
handleMessage)。Looper把纸条掏出来之后,就会交给对应的Handler,说:“嘿,这是你的纸条,照着上面说的去干吧!”
- 子线程中的它:负责写纸条(创建Message)和往筐里扔纸条(
今天,咱们就重点“解剖”一下这个最神秘、最核心的“监工”——Looper。

最低0.47元/天 解锁文章
779

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



