Android消息机制
Android没有全局的消息队列,消息队列是和某个线程相关连在一起的,每个线程最多有一个消息队列,消息的取出和处理,也是在这个线程本身中完成。也就是说,在Android中,如果你想在当前线程使用消息模型,则必须构建一个消息队列,而消息机制的相关主要类是:
1. Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列);
2. Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息;
3. Message Queue(消息队列):用来存放线程放入的消息。
4. Message:Message是消息的载体,Message设计成为Parcelable类的派生类,这表明Message可以通过binder来跨进程发送。
Message的创建
通常我们都会用obtain()方法去创建Message,如果消息池中有Message有,则取出,没有,再重新创建。这样可以防止对象的重复创建,节省资源。创建之后的Message可以存放返回给主线程的信息和数据。
Message的发送
Message的发送是通过Handler来进行发送的,Handler可以携带消息返回主线程,Handler发送消息是通过两种方式,一种方式是send,一种方式是post。、
通过Handler,消息会被存放在主线程的Message Queue中,等待主线程的处理。
send方式主要方法
post方式主要方法
消息的处理
此时Looper会将Message从Message Queue中取出,交给发送Message的Handler处理,然后Handler会调用handlerMessage()方法接受消息。
总结
在android线程通信过程要弄清楚以下几点:
1. Looper用来遍历Message Queue中的Message,将其中的Message取出交由对应的Hanlder来处理;
2. Message Queue是存储消息的容器,Handler发送的消息暂时存放在这里等待处理;
3. 只有主线程的Looper和Message Queue是创建好的,其他线程需要人为创建;
4. Looper类提供了prepare方法来创建Looper,每个线程只有一个Looper,在Looper的构造方法中,又创建了与它一一对应的MessageQueue,所以MessageQueue也是唯一的;
5. Handler在线程之间的通信中起到两个作用,第一个是发送消息,第二个处理其发送的消息。