硬核|一份来自阿里、腾讯的Handler面试专题!!!

本文详细探讨了Android中Handler的重要性和使用,包括其在线程间通信、消息队列管理和内存泄漏预防的角色。分析了Handler、MessageQueue和Looper的源码,揭示了它们的工作原理,并提供了面试常问问题及解答,帮助开发者更好地理解和掌握Handler机制。
摘要由CSDN通过智能技术生成

前言

Handler有多重要我就不着重强调了,Handler作用不仅仅是线程之间的切换,关键是它可以处理消息队列的消息,比如像消息队列放入消息,或者处理从消息队列获取到的消息。另外还还有延迟多长时间去发送消息的功能等等。

另外像Android动画每一次刷新也需要Handler;Android是靠消息驱动的,没有消息机制手机根本无法工作,以上这些场景都用到Android消息机制,还有很多其他未知的场景可能也会用到Android消息机制,所以消息机制在Android中具有很重要的地位

还有很多栗子,这里就不一一论述学习Android Handler的重要性了


写正文之前先分享几个 Handler 的几个常见面试问题

  • 一个线程有几个 Looper?几个 Handler?
    答:一个 Thread 只能有一个 Looper,一个 MessageQueen,可以有多个 Handler 以一个线程为基准,他们的数量级关系是: Thread(1) : Looper(1) : MessageQueue(1) : Handler(N)

  • Handler 内存泄漏原因?
    答:Handler 允许我们发送延时消息,如果在延时期间用户关闭了 Activity, 那么该 Activity 会泄露。 这个泄露是因为 Message 会持有 Handler,而 又因为 Java 的特性,内部类会持有外部类,使得 Activity 会被 Handler 持有,这样最终就导致 Activity 泄露。

  • 以及最佳解决方案?
    答:
    1、最直接的思路就是避免使用非静态内部类。使用 Handler 的时候,放在一个新建的 文件中来继承 Handler 或者使用静态的内部类来替代。静态内部类不会隐含的持有 外部类的引用,因此这个 activity 也就不会出现内存泄漏问题。
    2、 如果你需要在 Handler 内部调用外部 Activity 的方法,你可以让这个 Handler 持有这 个 Activity 的弱引用,这样便不会出现内存泄漏的问题了。
    3、另外,对于匿名类 Runnable,我们同样可以设置成静态的,因为静态内部类不会持 有外部类的引用。
    4、 注意:如果使用 Handler 发送循环消息,最好是在 Activity 的 OnDestroy 方法中调用 mLeakHandler.removeCallbacksAndMessages(null);移除消息。(这不是解决内存泄漏 的方法)

  • 子线程中维护的 Looper,消息队列无消息的时候的处理方案是什么?有什么 用?
    答:在 Handler 机制里面有一个 Looper,在 Looper 机制里面有一个函数,叫做 quitSafely()和 quit()函数,这两个函数是调用的 MessageQueue 的 quit()。

  • Looper 死循环为什么不会导致应用卡死?
    答:Launch 桌面的图标第一次启动 Activity 时,会最终走到 ActivityThread 的 main 方 法,在 main 方法里面创建 Looper 和 MessageQueue 处理主线程的消息,然后 Looper.loop()方法进入死循环,我们的 Activity 的生命周期都是通过 Handler 机制 处理的,包括 onCreate、onResume 等方法,下面是 loop 方法循环。 主线程的主要方法就是消息循环,一旦退出消息循环,那么你的应用也就退出了, Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞, 能一直处理事件就不会产生 ANR 异常。

     

如何学习Handler?

既然Handler这么重要,那我们该如何学习呢?
关于如何学习Handler开发知识,最近小编有幸在字节跳动总监手里扒到这份深入解析Handler消息机制资料,今天就拿出来分享给大家。

本笔记主要讲解了Handler的主要模块:


第一节 宏观理论分析与Message源码分析

  • 设计Handler 的初衷
  • Handler 提供的一些方法
  • Handler实现原理 - 理论分析
  • Message 源码分析


第二节MessageQueue的源码分析

  • 消息队列存储原理
  • 使用JNI实现的native方法
  • 创建与销毁
  • 消息入队管理enqueueMessage()方法
  • 同步消息拦截器
  • 队列空闲处理器IdleHandler
  • 消息出队管理next()方法


    在这里插入图片描述

    在这里插入图片描述

第三节Looper的源码分析

  • 创建与退出Looper
  • 运行Looper处理消息

第四节handler的源码分析

  • 初始化
  • 发送消息
  • 接收消息
  • 内存泄漏的可能

第五节Handler机制实现原理总结

  • Message缓存池
  • 真正的阻塞发生在MessageQueue
  • 为什么推荐使用Handler实现线程间通信

由于篇幅原因,这份纯手写笔记已经被整理成了PDF文档,有需要AndroidFramework开发笔记完整文档,可点击下方链接免费获取,希望大家都能开开心心,顺利拿下自己心仪的offer!

最后提醒:以上整理的所有PDF,均免费分享,有需要的朋友,[点击这里]进群!联系管理员免费获取!加入我们的圈子领取资料,和我们一起学习交流吧!~

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值