安卓中的消息队列基于Handler
和Looper
机制实现,核心组件包括:
步骤 | 操作说明 | 代码示例 |
---|---|---|
创建Handler | 重写handleMessage() 处理逻辑 |
new Handler(Looper.getMainLooper()) {<br> @Override<br> public void handleMessage(Message msg) {<br> // 处理消息<br> }} |
发送消息 | 通过sendXxx() 方法投递 |
handler.sendEmptyMessage(1);<br>handler.sendMessage(msg);<br>handler.post(runnable); |
启动循环 | 在线程中调用Looper.loop() |
Looper.prepare();<br>Looper.loop(); |
// 子线程初始化 class WorkerThread extends Thread { private Handler handler; @Override public void run() { Looper.prepare(); // 创建消息队列 handler = new Handler(Looper.myLooper()) { @Override public void handleMessage(Message msg) { // 处理子线程消息 } }; Looper.loop(); // 开启循环 } public void sendMessage(Message msg) { handler.sendMessage(msg); } }
特性 | 实现方式 | 代码示例 |
---|---|---|
消息优先级 | 使用Message.setAsynchronous() |
msg.setAsynchronous(true); |
延时消息 | sendMessageDelayed() |
handler.sendEmptyMessageDelayed(1, 1000); |
消息拦截 | 在handleMessage() 前过滤 |
if(msg.what == 2) return; |
问题 | 解决方案 |
---|---|
内存泄漏 | 使用静态内部类+弱引用 |
死循环 | 确保Looper.loop() 只调用一次 |
Q1:Handler导致的内存泄漏如何解决?
A:将Handler声明为静态内部类,并通过弱引用持有外部上下文。
private static class MyHandler extends Handler { private WeakReference<Activity> mActivity; public MyHandler(Activity activity) { mActivity = new WeakReference<>(activity); } }
Q2:如何在子线程中创建独立消息队列?
A:在子线程中调用Looper.prepare()
创建消息队列,再通过Handler
发送消息。
new Thread(() -> { Looper.prepare(); new Handler(Looper.myLooper()) { @Override public void handleMessage(Message msg) { // 处理子线程消息 } }; Looper.loop(); }).start();