1.Handler全解
Handler全解
Handler的码详作用是发送并处理一个线程关联的Message或Runable。
在UI线程中创建Handler,码详在子线程中发送消息。码详
Looper从ActivityThread类开始分析,码详黑客编程源码在哪ActivityThread并不是码详线程,而是码详开启主线程的类。Looper构造方法中创建了MessageQueue对象,码详保证了一个线程只对应一个MessageQueue对象。码详Looper死循环不断检查MessageQueue是码详否有可处理的消息,将消息分发给Handler处理。码详
Looper死循环的码详高位长上影阴线源码目的是防止线程退出,保证UI刷新和生命周期回调的码详完成,使用死循环实现不消耗过多资源,码详通过Linux pipe/epoll机制让线程进入休眠状态,码详释放CPU资源,码详等待被唤醒。直清进件系统源码
唤醒Looper的消息来自于创建ActivityThread后,通过thread.attach(false)方法接收系统服务AMS发送的事件,通过sendMessage方法将消息发送给AndroidThread的Handler实现内部类H,完成ActivityThread到UI线程的切换。
MessageQueue插入和读取操作通过enqueueMessage和next方法实现,运动助手修改步数源码使用单链表维护消息,方便插入和删除。nativePollOnce方法在没有消息或等待时间不到时,将线程设置为等待状态,直到获取到下一个Message。手机浏览器阅读源码
Looper的loop方法死循环是为了无限读取MessageQueue的Message,next方法死循环是为了读取延迟的Message消息,计算需要等待的时间,让线程等待。
Handler构造方法利用threadLocal线程相关性获取当前线程对应的Looper,Handler对象将自己的引用放入msg中,通过enqueueMessage中的nativeWake唤醒等待线程,最终在Handler的dispatchMessage方法处理消息。
在子线程中创建Handler需要注意退出时机,避免子线程一直处于等待状态。Looper.quit方法退出后,发送的消息会失败,子线程也应手动调用quit方法终止。
Handler全解涵盖了Handler、Looper、MessageQueue的使用和原理,了解这些机制可以更好地管理线程和消息处理。