对于handler来说主要有两个用途:
1.循环执行任务。
2.执行与当前线程不同的线程发送过来的指令,也就是线程间的通信
用法是在主线程中实例化handler和Message(这里要注意内存泄漏问题)
然后在子线程中接收相应的消息处理不同的事件
涉及到的点 handler message MessageQueue looper
handler的初始化 如果在主线程中不需要自己去实现looper,如果在子线程中需要先调用looper.prepare再调用looper.loop 这里可以在源码中看到如果在子线程中looper为null会抛出异常
在主线程中我们可以直接使用的原因是应用在启动的时候,在ActivityThread的main方法中系统已经调用过looper.prepareMainLooper方法和loop方法。
Looper.prepare()会实例化MessageQueue
不管是调用sendMessage还是post(runnable run)方法最终都是会调用handler中的sendMessageAtTime方法
为什么handler.postDelay方法不会造成ANR呢?
Looper.loop( )是会让主线程进入死循环。但是不会卡主程序,卡住程序主要是handleMessage处理消息的时候来不及处理导致的。Android的消息处理机制是事件驱动型的。
应用在使用过程中发生了ANR 是发生在哪个方法?
通过上面的分析,消息的分发都是通过dispatchMessage来做的,所以如果发生了anr都会在这里产生。
网友评论