android.os.Message是定义一个Messge包含必要的描述和属性数据,并且此对象可以被发送给android.os.Handler处理。属性字段:arg1、arg2、what、obj、replyTo等;其中arg1和arg2是用来存放整型数据的;what是用来保存消息标示的;obj是Object类型的任意对象;replyTo是消息管理器,会关联到一个handler,handler就是处理其中的消息。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。
public class MainActivity extends Activity {
private Button button;
// handler对象,用来接收消息~
private Handler handler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) { //这个是发送过来的消息
// 处理从子线程发送过来的消息
int arg1 = msg.arg1; //获取消息携带的属性值
int arg2 = msg.arg2;
int what = msg.what;
Object result = msg.obj;
System.out.println("-arg1--->>" + arg1);
System.out.println("-arg2--->>" + arg2);
System.out.println("-what--->>" + what);
System.out.println("-result--->>" + result);
Bundle bundle = msg.getData(); // 用来获取消息里面的bundle数据
System.out.println("-getData--->>"
+ bundle.getStringArray("strs").length);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 启动一个子线程
new Thread(new MyThread()).start(); //一定要在这里面启动!
}
});
}
public class MyThread implements Runnable {
@Override
public void run() { //run方法里面写要发送的消息对象,并对消息携带的信息进行定义!!
// TODO Auto-generated method stub
// 第一种方式:获取消息
// Message message = Message.obtain();
// message.what = 1;
// message.arg1 = 2;
// message.arg2 = 3;
// message.obj = "jack";
// handler.sendMessage(message);
// 第二种方式
// Message message = Message.obtain(handler);
// message.what = 1;
// message.arg1 = 2;
// message.arg2 = 3;
// message.obj = "jack";
// //handler.sendMessage(message);
// //此时在构造方法里面已经将message的target绑定了handler不需要再次发送了。
// message.sendToTarget();
// 第三种方式,和上面是没有区别的。。
// Message message = Message.obtain(handler, 33);
// message.arg1 = 2;
// message.arg2 = 3;
// message.obj = "jack";
// message.sendToTarget();
// 第4种方式这几种方式都是大同小异,只不过是内部封装了而已,使用的时候根据实际需要就可以了。
Message message = Message.obtain(handler, 33, 2, 3, "hello");
Bundle data = new Bundle(); //message也可以携带复杂一点的数据比如:bundle对象。
data.putStringArray("strs", new String[] { "c", "c++", "java" });
message.setData(data);
message.sendToTarget(); // 不可忘!
} }}