Android Handler 机制详解

Handler 是 Android 系统中用于线程间通信的核心机制,它基于消息队列(MessageQueue)和循环器(Looper)实现,主要用于在不同线程间发送和处理消息。

核心组件

  1. Handler:消息的发送者和处理者

    • 发送消息到 MessageQueue
    • 处理从 MessageQueue 取出的消息
  2. MessageQueue:消息队列

    • 以队列形式管理 Message
    • 按时间顺序排列消息
  3. Looper:消息循环

    • 不断从 MessageQueue 取出消息
    • 将消息分发给对应的 Handler 处理
  4. Message:消息载体

    • 包含消息内容和处理者信息

工作原理

  1. 主线程的 Looper 准备

    • Android 主线程(UI 线程)在启动时就已经通过 Looper.prepareMainLooper() 初始化了 Looper
    • 开发者无需手动为主线程创建 Looper
  2. 子线程使用 Handler

    java 复制代码
    // 在子线程中
    Looper.prepare(); // 初始化Looper
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // 处理消息
        }
    };
    Looper.loop(); // 开始消息循环
  3. 消息发送流程

    • Handler 发送消息 (sendMessage()post())
    • 消息被加入 MessageQueue
    • Looper 不断循环从 MessageQueue 取出消息
    • 消息被分发回 Handler 的 handleMessage() 处理

常用方法

  1. 发送消息

    • sendMessage(Message msg)
    • sendEmptyMessage(int what)
    • post(Runnable r)
    • sendMessageDelayed(Message msg, long delayMillis)
  2. 处理消息

    • handleMessage(Message msg) (需重写)
  3. 移除消息

    • removeMessages(int what)
    • removeCallbacks(Runnable r)

内存泄漏问题

Handler 使用不当容易引起内存泄漏,常见场景:

  • 非静态内部类 Handler 隐式持有外部类(如 Activity)引用
  • 消息队列中未处理完的消息持有 Handler 引用

解决方案

  1. 使用静态内部类 + WeakReference

    java 复制代码
    private static class MyHandler extends Handler {
        private WeakReference<Activity> mActivity;
        
        public MyHandler(Activity activity) {
            mActivity = new WeakReference<>(activity);
        }
        
        @Override
        public void handleMessage(Message msg) {
            Activity activity = mActivity.get();
            if (activity != null) {
                // 处理消息
            }
        }
    }
  2. 在 Activity 销毁时清除消息

    java 复制代码
    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
    }

典型应用场景

  1. 子线程执行耗时任务后更新 UI
  2. 定时任务执行
  3. 延迟任务处理
  4. 不同组件间的通信

Handler 机制是 Android 异步编程的基础,理解其原理对于开发高效、稳定的 Android 应用至关重要。

相关推荐
y = xⁿ6 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
2601_962066498 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
用户693717500138414 小时前
曾经安卓开发人手一个的 EventBus,为什么现在没人爱用了?
android·android studio
九皇叔叔16 小时前
MySQL ORDER BY 性能优化详解:Using filesort、联合索引、ASC/DESC 与覆盖索引
android·adb
OriginCoding16 小时前
用 AI Agent 协作完成一个 Android TOTP 应用:从需求边界到 v1.0.0
android·ai编程
杉氧19 小时前
React 灵魂:深入剖析 Hooks 与副作用(Side Effects)陷阱
android·前端·react native
又见情义19 小时前
RK3568 + RTL8211F 网络唤醒(WOL)功能适配全记录
android·网络·驱动开发
用户09340777351420 小时前
HarmonyOS WPS Open SDK 实践:registerApp 鉴权与就绪门禁
android·typescript·harmonyos
jike_202620 小时前
会议离线录音APP:无网络记录能力对比
android·智能手机·语音识别
always_TT21 小时前
【Python 字符串格式化:format() 方法】
android·开发语言·python