第13章 消息处理机制
Android应用程序是通过消息来驱动的。应用程序的每一个线程在启动时,都可以首先在内部创建一个消息队列,然后再进入到一个无限循环中,不断检查它的消息队列是否有新的消息需要处理。如果有新的消息需要处理,那么线程就会将它从消息队列中取出来,并且对它进行处理;否则,线程就会进入睡眠等待状态,直到有新的消息需要处理为止。这样就可以通过消息来驱动应用程序的执行了。
Android系统主要通过MessageQueue、Looper和Handle三个类来实现Android应用程序的消息处理机制,其中,MessageQueue类用来描述消息队列;Looper类用来创建消息队列,以及进入消息循环;Handler类用来发送消息和处理消息。
1. 创建线程消息队列
Looper类的静态成员函数prepareMainLooper和prepare的实现:
第13章 消息处理机制Looper类的静态成员函数prepareMainLooper只能在Android应用程序主线程中调用。Android应用程序主线程是一个特殊的线程,因为只有它才可以执行与UI相关的操作,因此我们又将它称为UI线程。将Android应用程序主线程的Looper对象另外保存在一个独立的静态成员变量中,是为了让其他线程可以通过Looper类的静态成员函数getMainLooper来访问它,从而可以往它的消息队列中发送一些与UI操作相关的消息。
一个c++层的Looper对象在创建的过程中,又会在内部创建一个管道。管道的读端文件描述符添加到这个epoll实例中,以便可以对它所描述的管道的写操作进行监听。
2. 线程消息循环过程
Looper类的静态成员函数loop:
第13章 消息处理机制 第13章 消息处理机制3. 线程消息发送过程
第13章 消息处理机制通过注册空闲消息处理器,我们就可以把一些不重要或者不紧急的事情放在线程空闲的时候来执行这样就可以充分地利用线程的空闲时间。