而对事件进行处理的就是 looper,所以只能说事件的处理如果阻塞会导致
ANR,而不能说 looper 的无限循环会 ANR
另一种情况就是在子线程创建 Handler,此时由于这个线程中没有默认开启的消
息队列,所以我们需要手动调用 looper.prepare(),并通过 looper.loop 开启消息
主线程 Looper 从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程
往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件
读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因
此 loop 的循环并不会对 CPU 性能有过多的消耗。
5. 内存泄漏的场景和解决办法
1.非静态内部类的静态实例
非静态内部类会持有外部类的引用,如果非静态内部类的实例是静态的,就会
长期的维持着外部类的引用,组织被系统回收,解决办法是使用静态内部类
2.多线程相关的匿名内部类和非静态内部类
匿名内部类同样会持有外部类的引用,如果在线程中执行耗时操作就有可能发
生内存泄漏,导致外部类无法被回收,直到耗时任务结束,解决办法是在页面
退出时结束线程中的任务
3.Handler 内存泄漏
Handler 导致的内存泄漏也可以被归纳为非静态内部类导致的,Handler 内部
message 是被存储在 MessageQueue 中的,有些 message 不能马上被处理,存在
的时间会很长,导致 handler 无法被回收,如果 handler 是非静态的,就会导致
它的外部类无法被回收,解决办法是 1.使用静态 handler,外部类引用使用弱引
用处理 2.在退出页面时移除消息队列中的消息
4.Context 导致内存泄漏
根据场景确定使用 Activity 的 Context 还是 Application 的 Context,因为二者生命
周期不同,对于不必须使用 Activity 的 Context 的场景(Dialog),一律采用
Application 的 Context,单例模式是最常见的发生此泄漏的场景,比如传入一个
Activity 的 Context 被静态类引用,导致无法回收
5.静态 View 导致泄漏
使用静态 View 可以避免每次启动 Activity 都去读取并渲染 View,但是静态 View