本文同步发表于我的微信公众号微信搜索程语新视界即可关注每个工作日都有文章更新在 Android 的 Handler 机制中‌ThreadLocal 的核心作用是为每个线程提供独立的 Looper 实例确保线程间数据隔离从而实现 Handler 与特定线程的消息循环绑定‌。ThreadLocal 在 Handler 机制中的作用‌线程局部存储‌ThreadLocal 为每个线程维护一个独立的 Looper 副本不同线程通过同一个 ThreadLocal 对象获取的是各自线程对应的 Looper互不干扰。‌保证线程唯一性‌通过sThreadLocal.get()判断当前线程是否已创建 Looper若已存在则抛出异常确保“一个线程只能有一个 Looper”‌。‌简化线程通信‌Handler 在创建时通过Looper.myLooper()获取当前线程的 Looper进而绑定到该线程的消息队列MessageQueue实现消息的发送与处理‌。场景‌主线程UI 线程‌Android 系统在 ActivityThread 启动时自动调用Looper.prepareMainLooper()将主线程的 Looper 存入 ThreadLocal因此主线程中可直接创建 Handler‌。‌子线程‌若需在子线程中使用 Handler必须先调用Looper.prepare()创建 Looper再调用Looper.loop()启动消息循环。否则Looper.myLooper()返回 nullHandler 构造会抛出异常‌。核心源码// Looper.java 中的静态 ThreadLocal static final ThreadLocalLooper sThreadLocal new ThreadLocal(); // 获取当前线程的 Looper public static Looper myLooper() { return sThreadLocal.get(); // 从当前线程的 ThreadLocal 中取 } // 为当前线程准备 Looper public static void prepare() { if (sThreadLocal.get() ! null) { throw new RuntimeException(Only one Looper may be created per thread); } sThreadLocal.set(new Looper(quitAllowed)); // 绑定到当前线程 }备注每个线程内部通过Thread.threadLocals类型为ThreadLocalMap存储该线程的 ThreadLocal 变量因此set()和get()操作实际作用于当前线程的私有空间‌。注意事项‌内存泄漏风险‌若在线程池中使用 ThreadLocal如 Looper线程复用可能导致 Looper 或相关对象无法被回收。建议使用完后调用remove()清理‌。‌仅适用于线程作用域场景‌当数据需要以线程为单位隔离时才应使用 ThreadLocal而非全局共享变量‌。ThreadLocal 是 Handler 实现线程绑定与消息队列的隔离使得 Handler 能够安全地在不同线程间传递消息而不发生冲突。