当前位置: 首页 > news >正文

主线程 MainLooper 和一般 Looper 的异同?

更多面试题请看这里:https://interview.raoyunsoft.com/

核心区别:
  1. 退出机制

    • MainLooper:不可主动退出(quit()/quitSafely())。因为主线程需要持续处理系统事件(如用户输入、生命周期回调等),只能由系统终止进程时自动销毁。
    • 一般 Looper:必须手动调用 quit() 退出,否则会导致线程资源泄漏。例如:
      HandlerThread workerThread = new HandlerThread("Worker");
      workerThread.start();
      // 使用结束后必须退出
      workerThread.quit(); 
      
  2. 实例存储方式

    • MainLooper:通过 Looper.prepareMainLooper() 初始化,并静态缓存到 Looper.sMainLooper 中,可通过 Looper.getMainLooper() 全局获取。
    • 一般 Looper:由线程通过 Looper.prepare() 初始化,存储在线程局部的 ThreadLocal<Looper> 中,仅限当前线程访问。

关键相同点:
  1. 创建逻辑一致
    两者都通过相同的构造函数创建(最终由 Looper.prepare() 触发),内部维护 MessageQueue 和线程绑定关系。

    // 普通线程初始化 Looper 的典型流程
    new Thread(() -> {Looper.prepare(); // 初始化当前线程的 LooperHandler handler = new Handler();Looper.loop();
    }).start();
    
  2. 消息处理机制相同
    无论 MainLooper 还是普通 Looper,都通过 loop() 方法循环处理 MessageQueue 中的消息,且都遵循相同的消息分发逻辑(通过 Handler.dispatchMessage() 处理消息)。


高频追问:为什么主线程不需要手动初始化 Looper?
  • 底层启动机制
    Android 进程的入口是 ActivityThread.main(),它在启动时自动调用 Looper.prepareMainLooper() 创建主线程 Looper 并启动 loop()
    // ActivityThread.main() 关键代码
    public static void main(String[] args) {Looper.prepareMainLooper(); // 创建 MainLooperActivityThread thread = new ActivityThread();thread.attach(false);Looper.loop(); // 开启消息循环
    }
    
  • 必要性
    四大组件(Activity/Service 等)的生命周期回调都依赖主线程的消息队列。若主线程没有 Looper,系统无法调度组件逻辑,App 将崩溃并抛出 "Main thread not have Looper" 异常。

扩展场景:主线程 Looper 的特殊性
  • 阻塞风险
    MainLooper 的 MessageQueue 如果处理耗时操作(如密集计算),会导致界面卡顿(ANR)。此时应使用工作线程 + Handler 机制。
  • 调试技巧
    通过 Looper.getMainLooper().setMessageLogging() 可打印主线程消息轨迹,定位性能瓶颈。

💡 思考题:为什么 Handler 的默认构造函数绑定当前线程的 Looper?这会导致什么隐患?

http://www.dtcms.com/a/477839.html

相关文章:

  • 【论文精读】STAR:基于文本到视频模型的空间-时间增强真实世界视频超分
  • 建设银行的积分网站百度渠道开户
  • 万网 速成网站嘉定品牌网站建设
  • Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
  • Windows Docker Desktop占用C盘空间过大解决办法集合
  • 平面的方程公式
  • 2025年“羊城杯”网络安全大赛 线上初赛 (WriteUp)
  • 网络安全概念之网闸防火墙AI版
  • 学习笔记2: 深度学习之logistic回归梯度下降
  • 网络安全等级测评师能力评估样卷及答案
  • 网站服务器用什么系统网站建设及管理制度文章
  • 网站添加wordpress创意咨询策划公司
  • 企业网站设计专业好吗胶州房产网
  • 环境变量完全指南:用 Vite 把「配置」玩出花
  • 深入解析JAVA虚拟线程
  • 不同设计牙周探针在深牙周袋探查中的精确性与局限性比较
  • 三极管分类
  • Leetcode 3710. Maximum Partition Factor
  • 亚马逊,塔吉特采购测评:高砍单率核心原因及技术破解策略
  • SQLite3数据库——Linux应用
  • 人机关系中“看不见的手”
  • 上街区网站建设做网站用什么系统好
  • k8s cert-manager cert-manager-webhook-xxx pod 证书过期问题处理
  • 宝塔服务器磁盘爆满:占用50G磁盘空间的.forever日志文件处理导致服务崩溃的教训
  • Docker资源限制全解析
  • 毫米级的安全舞蹈
  • 成都网站专业制作一造和一建哪个难度大
  • 解码AI智能体的大脑:Function Calling 与 ReAct 策略深度对决
  • K8s多租户方案指南--图文篇
  • 去一个新公司~重新设置git信息,clone项目 ~需要做的