1.Handler的工作流程( 七 )


4. 4.1为什么一个线程只能创建一个
我们刚才其实将的时候讲过了
进行初始化的时候会调用的set方法,set方法在内部会获得当前的线程,并根据当前的线程创建,每个线程都有自己的  , 而中只能保存一个实例 。
4.2为什么陷入死循环的时候不会ANR,主线程是阻塞的嘛?
我们回顾一下的流程,当它被之后,调用 的 loop() 方法 , 它在执行过程中会不断从消息队列中获取消息 , 并将消息分发给对应的进行处理 。
的loop是个无限循环的方法,但是不会阻塞主线程,更不会ANR
我们先了解一下什么情况会导致ANR
4.2.1什么情况下会导致ANR
我们一般都知道如果一个界面如果长时间没有反应则是因为它陷入了ANR
但是比较官方的说法是:
在中 , 主线程负责处理 UI 相关的操作 , 包括用户输入、界面更新等 。为了保证主线程的响应性 ,  系统对主线程的响应时间有一定的限制 , 通常为 5 秒钟 。如果主线程在这个时间内没有响应 , 就会被认为发生了 ANR , 并弹出 ANR 对话框
但是我们在进行的loop方法的时候,它会判断当前的中是否有新消息,如果没有新消息,loop() 方法会进入等待状态 , 不会占用主线程的执行时间片 。只有当有新的消息到达时 , loop() 方法才会被唤醒并继续执行 。