学习资料 《Android开发艺术探索》
Android的消息机制主要指Handler的运行机制。
产生的原因:
Android的主线程就是ui线程,多线程访问ui会造成ui控件不安全,并发访问可能会导致UI控件处于不可预期的状态
加锁的缺点:
首先会让UI访问变得复杂,其次降低UI访问的效率(锁机制会阻塞某些线程的执行)
最后:
最简单高效的方式就是采用单线程来进行UI操作
Hnadler运行的条件:
底层MessageQueue和Looper的支撑。
Looper的工作原理
Lopper在android消息机制中扮演着消息循环的角色,他会不停的从MessageQueue中查看是否有新的消息,如果有新的消息就会处理,否则一直处于阻塞状态。
Loopeer的构造方法
首先创建一个MessageQueue(消息队列Looper的prepare方法创建一个Looper,loop()开启消息循环)
然后保存当前线程
Looper的重要性
Handler工作需要looper(没有looper会报错)
主线程也是需要Looper的(prepareMainLooper方法给ActivityTread创建Looper)
通过Looper提供的getMainLooper方法,可以在任何地方获取到主线程
Looper的退出(建议在不需要的时候终止looper)
quit(直接退出looper)和quitSafely(设置退出标记,再把消息处理完毕后安全退出)来退出一个Looper。
Looper的loop方法源码实现
Loop是一个死循环,跳出的唯一方式就是MessageQueue等于null。
Looper的next方法是获取新的消息,没有消息就会阻塞在哪里
Handler的工作原理
工作内容:发送(POST和send一系列方法)和接收消息
Handler发送的源码解析
向消息队列中插入一条消息
消息队列的next方法返回这条消息给Looper,looper收到消息开始处理
Looper把消息交给Handler处理
Hanler处理消息
dispatchMessage方法调用(判断callback是否为null,不为nul通过handlerCallback处理消息)
主线程的消息循环
前面已经说过ActivityThread也是通过Looper的prepareMainLoope方法来创建主线程的Looper和MessagQueue,并且通过Looper的loop方法开启消息循环
主线程的消息队列把消息交给主线程的Handler(ActivityThread.H),其中包含四大组件的启动和停止
本人很菜,还在学习中,如有错误,欢迎指正留言。