Android 主线程中 Looper 的轮询死循环为何没阻塞主线程
01.造成ANR的原因
- 造成ANR的原因一般有两种:
- 当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
- 当前的事件正在处理,但没有及时完成
- 为了避免ANR异常,android使用了Handler消息处理机制。让耗时操作在子线程运行。
Android 主线程中 Looper 的轮询死循环为何没阻塞主线程
主线程如何自动调用Looper.prepare()
ActivityThread,并且在main方法中我们会看到主线程也是通过Looper方式来维持一个消息循环。那么这个死循环会不会导致应用卡死,即使不会的话,它会慢慢的消耗越来越多的资源吗?
首先看看构造方法
1 | public Handler(Callback callback, boolean async) { |
Handler 发送消息的形式主要有以下几种形式,其最终调用的都是 sendMessageAtTime()
方法
1 | public final boolean sendMessage(Message msg){ |
handler机制大家都比较熟悉呢。在子线程中发送消息,主线程接受到消息并且处理逻辑。如下所示
1 | public class MainActivity extends AppCompatActivity { |
1.1 自定义attr属性与读取
1 | /** |