第7章 线程消息通信与异步处理

Android在Java标准线程模型的基础上,提供了消息驱动机制,用于多线程之间的通信。基于消息驱动机制的线程通信模型称为线程消息通信。在标准线程模型中,线程执行完毕后便退出,而Android扩展了线程的退出机制,在启动线程时,可以首先在线程内部创建一个消息队列,然后让线程进入一个无限循环中,在这个无限循环中,线程会不断检查消息队列中是否有消息。如果需要线程执行某个任务,便向线程的消息队列中发送对应该任务的消息,线程在无限循环中检查到消息队列中有消息到来,便会获取该消息,进而执行该消息对应的处理流程。如果线程的消息队列中没有消息,线程便进入等待状态,等待消息的到来。这样便可以通过消息控制线程的执行,因此也称为消息驱动机制。

在消息驱动机制中主要涉及4个概念:消息、消息队列、消息循环、消息处理器。消息用于表示一个可执行任务,通常在消息内部会封装消息的标识、消息的执行时间以及消息数据。消息创建完毕后,通过消息处理器将其发送到线程的消息队列中,消息队列维护当前可执行消息的列表。当前线程进入消息循环中遍历消息队列获取消息,然后根据消息标识通知消息处理器执行对应的处理函数。

7.1 什么是Looper线程

Android基于Java标准线程模型开发了Looper线程,用于实现消息驱动机制。Looper线程与标准线程的区别在于:Looper线程的run方法执行后并不会立即退出,而是进入一个loop消息循环中等待消息的到来,然后根据消息类型分别作出不同的处理。这样,后台中只需运行单一线程,当需要定时或者不定时执行不同任务时,分别发送不同的消息给Looper线程去处理,这样就避免了频繁创建/销毁线程所带来的开销。

Looper线程首先是一个Thread,由Java标准线程演化而来。将一个普通线程变成Looper线程只需要以下代码:


class LooperThread extends Thread{//继承自Thread类

public Handler mHandler;//需要一个Handler对象发送和处理消息

public void run(){//实现线程的run方法

Looper.prepare();//Looper线程准备阶段

mHandler=new Handler(){//初始化消息处理器

public void handleMessage(Message msg){

//在这里处理消息

}

};

Looper.loop();//Looper线程循环阶段

}


由以上代码可知,Looper线程需要继承自Thread类,并实现其run方法,这样便可以像启动标准线程那样启动Looper线程。Looper线程启动后进入run方法,在该方法中执行以下三步操作:

1)调用Looper.prepare方法进入Looper线程准备阶段。

2)创建Handler对象用于实现消息处理器,消息处理器负责发送和处理消息。

3)调用Looper.loop方法进入Looper线程循环阶段。

通过以上三步,Looper线程提供了消息驱动机制的消息队列、消息循环和消息处理器,此后便可以接收消息了。接下来详细分析这三部分内容。