1,应用程序的入口分析:
app的入口在ActivityThread的main方法中, 创建了Looper, 让后开启消息循环, 在java中, 如果程序没有死循环, 执行完main函数, (比如构建完视图等等代码) 以后就会立马退出. 之所以app一直运行, 就是因为Looper.loop()里面的一个死循环
looper主要有两个核心的方法, 一是prepare, 二十开始loop循环, 通过Looper, Handler, Message, MessageQueue等组成了Android的消息处理机制.
2, 为什么需要这样一个消息机制,
这个问题其实和为什么ui操作一定要在主线程运行有相同的解释, 不是这样做的话, 不安全.....
3, 消息机制的分析,
一个Activity中可以创建出多个工作线程,如果这些线程把他们消息放入Activity主线程的消息队列中,那么消息就会在主线程中处理了。因为主线程一般负责视图组件的更新操作,对于不是线程安全的视图组件来说,这种方式能够很好的实现视图的更新。
那么,子线程如何把消息放入主线程的消息队列中呢?只要Handler对象以主线程的Looper创建,那么当调用Handler的sendMessage方法,系统就会把消息主线程的消息队列,并且将会在调用handleMessage方法时处理主线程消息队列中的消息。
对于子线程访问主线程的Handler对象,你可能会问,多个子线程都访问主线程的Handler对象,发送消息和处理消息的过程中会不会出现数据的不一致呢?答案是Handler对象不会出现问题,因为Handler对象管理的Looper对象是线程安全的,不管是添加消息到消息队列还是从消息队列中读取消息都是同步保护的,所以不会出现数据不一致现象。
还有补充一句, 如果我的项目中用到了异步的话, 我会用Rxjava, 这个handler其实也就是那么回事;