Android Handler机制详解
1. Handler基础
- Android规定只能在主线程更新UI,子线程需通过Handler发送消息至主线程处理,实现生产者-消费者模式。
Android Handler机制通过主线程Looper循环处理消息,实现跨线程通信。掌握其使用需了解消息发送、队列管理、线程初始化及内存泄漏预防。Handler构造、Message/MessageQueue/Looper交互原理,并提供子线程正确用法及优化建议。

所有消息最终调用enqueueMessage()方法入队:
private static final int MESSAGE_TEST_1 = 1;
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what) {
case MESSAGE_TEST_1:
tvTest.setText((String) msg.obj);
break;
}
return false;
}
});
常用发送方式:
sendMessage(Message):普通消息sendEmptyMessage(int):仅标记sendMessageDelayed(Message, long):延迟发送post(Runnable):直接执行任务View的post()和Activity的runOnUiThread()均基于Handler实现:
tvTest.postDelayed(() -> tvTest.setText("5s"), 5000);
runOnUiThread(() -> updateUI());
子线程未初始化Looper时创建Handler会抛出异常:
new Thread(() -> {
new Handler(msg -> false); // 报错:Looper.prepare()未调用
}).start();
需先调用Looper.prepare()并启动循环:
new Thread(() -> {
Looper.prepare();
new Handler(Looper.myLooper(), msg -> false);
Looper.loop();
}).start();
public class Message {
public int what; // 消息类型
public Object obj; // 数据对象
public long when; // 执行时间
}
通过obtain()复用Message减少GC压力,池大小限制为50:
Message msg = Message.obtain(handler);
msg.what = MESSAGE_TEST_1;
handler.sendMessage(msg);
Looper通过死循环处理消息:
for (;;) {
Message msg = queue.next();
if (msg == null) return;
msg.target.dispatchMessage(msg);
msg.recycleUnchecked();
}
Handler持有Activity引用易导致泄漏,解决方案:
handler.removeMessages(id)推荐使用HandlerThread自动管理Looper:
HandlerThread thread = new HandlerThread("Worker");
thread.start();
Handler handler = new Handler(thread.getLooper());

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online