在消息处理机制中,消息都是存放在一个消息队列中去,而应用程序的主线程就是围绕这个消息队列进入一个无限循环的,直到应用程序退出。如果队列中有消息,应用程序的主线程就会把它取出来,并分发给相应的Handler进行处理;如果队列中没有消息,应用程序的主线程就会进入空闲等待状态,等待下一个消息的到来。在Android应用程序中,这个消息循环过程是由Looper类来实现的,它定义在
frameworks/base/core/java/android/os/Looper.java文件中。
先理解几个概念:
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
1、在Activity中需要声明一个Handler,并在onCreate()方法中初始化。代码如下:
static Handler handler;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
// 处理消息
handler = new Handler() {
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//处理what=1的消息
break;
case 1:
//处理what=2的消息
break;
default:
break;
}
}
};
}
handlerMessage方法的作用就是从消息队列中读取消息并根据消息的不同内容做相应的处理
2、你需要一个线程,用来做耗时的工作,并发送消息。线程的代码如下:
private class WifiThread implements Runnable {
@Override
public void run() {
//do something
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg);
}
线程重写的run()方法中,首先要从新建一个消息,然后初始化消息,也就是将信息写入到消息中,然后就是发送消息。
3、在Activity中启动线程
new WifiThread().run()
4.done
实际上,每一个线程都有一个Looper对象和一个消息队列,Looper将循环的检测消息队列并从中取出消息。handler的默认初始化函数中将handler对象与这个Looper绑定,这样就能通过handler这个对象向消息队列中发送和接受消息,就是这么简单。当然,handler还有一个post()方法族,可以将runnable对象加入到消息队列中,这里就不多做介绍了。