前言
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,均免费分享,有需要的朋友,[点击这里]进群!联系管理员免费获取!加入我们的圈子领取资料,和我们一起学习交流吧!~