下面和大家分享一下Android中非常重要的消息处理机制,说到消息处理,Message,MessageQueue,Looper,Handler这四个类的作用是我们必须要明白的。
下面分别谈谈他们的作用:
MessageQueue
MessageQueue表示消息队列,存放消息的地方,按照“先进先出”的规则执行,每一个线程只可以拥有一个MessageQueue。当创建Looper对象的时候会创建一个MessageQueue对象。
Message
Message表示消息对象,MessageQueue中存放的对象,一个MessageQueue中可以存放多个Message对象。通过调用Message类的obtain()方法或者调用Handler类的obtainMessage()方法获取Message对象,但是这样并不一定会创建一个新的Message对象,如果消息池中有可用的Message对象则直接取出返回这个对象,否则如果消息池中没有可用的Message对象,则会创建一个新的Message对象。当消息队列中的Message对象被系统处理完之后,该Message对象会从MessageQueue中删除,然后放入消息池中。
Looper
Looper是用来操作MessageQueue的,每一个Looper对应一个MessageQueue,可以通过调用Looper.myLooper()方法获取当前线程的Looper对象,Looper循环从MessageQueue中取出Message对象,交给Handler调用handleMessage方法进行处理,处理完之后Message对象被放入消息池中。
Handler
Handler是消息的处理者,Handler将需要传递的信息封装成Message对象,然后调用sendMessage方法将Message放入MessageQueue中,当MessageQueue循环到该Message时,调用相应Handler对象的handleMessage方法对其进行处理。
注意在UI线程也就是主线程中默认会创建Looper对象和MessageQueue对象,如果在我们自己新开的线程中要进行消息处理,必须创建Looper对象和MessageQueue对象,通过调用Looper.prepare()方法可以创建Looper对象和MessageQueue对象,调用Looper.loop()方法可以启动消息循环队列。
下面和大家分享一个实例:
MainActivity.java代码
package com.zyb.message;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity {
//显示消息内容
private TextView show;
//程序是否退出
private boolean isExit=false;
//消息处理者
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
//获取消息内容
Object content=msg.obj;
show.setText(""+content);
}
super.handleMessage(msg);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show=(TextView)findViewById(R.id.show);
//启动线程
new Thread(new SubThread()).start();
}
@Override
protected void onDestroy() {
isExit=true;
super.onDestroy();
}
private class SubThread implements Runnable{
@Override
public void run() {
//创建Looper对象
Looper.prepare();
while(!isExit){
//获取消息
Message msg=handler.obtainMessage();
//消息的标识
msg.what=1;
//消息的内容,一个1000以内的随机数
msg.obj=new Random().nextInt(1000);
//发送消息
handler.sendMessage(msg);
//每隔一秒钟发送一次消息
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//启动消息循环队列
Looper.loop();
}
}
}
main.xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/show"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
</LinearLayout>