Android的消息机制也就是Handler的工作机制以及Handler所附带的MessageQueue和Looper的工作过程。
1.首先handler在创建的时候会采用当前线程的Looper来构建内部的消息循环系统,如果当前线程没有Looper,那么就会报错。
2.handler创建完毕后,这个时候内部的Looper以及MessageQueue就可以和Handler一起协同工作了。
MessageQueue主要包含俩个操作,插入和读取,这俩个操作分别对应的方法名是enqueueMessage和next ,而读取操作本身会伴随着删除操作,其中next的作用是从消息队列取出一条消息并将其从消息队列中移除,而enqueueMessage的作用是往消息队列是往消息队列中插入一条消息。
我们知道MessageQueue是不能处理消息的,所以得靠Looper处理。
那么Looper是怎么处理消息的呢?
那就是调用Looper的loop方法,loop方法会调用MessaQueue的next方法来获取新消息。如果next方法返回了新消息,则Looper就会处理这条消息,当没有消息时,next方法会一直阻塞在那里。
当然Looper也是可以退出的,Looper提供了quit和quitSafely来退出一个Looper;
二者的区别:
quit: 会直接退出Looper
quitSafely: 设定一个退出标记,然后把消息队列中已有消息处理完毕后才安全退出。
Handler的工作原理主要包含消息的发送和接收,Handler发送消息的过程仅仅是向消息队列中插入一条消息,MessageQueue的next方法就会返回这条消息给Looper,Looper收到消息后就开始处理了,最终消息由Looper交由Handler处理,既Handler的dispatchMessage方法会被调用,这时消息则由handler处理了。