使用handler.obtainMessage()时的参数问题

handler.obtainMessage() 的作用是从当前的Handler中获取指定的Message以供再次使用

尤其是在监测线程中 如果不断的new Message() 可能出现错误 (错误信息已经忘了 没有记录 =.=)

有5个重载的方法

1
2
3
4
5
public final Message obtainMessage ()   
public final Message obtainMessage (int what)
public final Message obtainMessage (int what, Object obj)
public final Message obtainMessage (int what, int arg1, int arg2)
public final Message obtainMessage (int what, int arg1, int arg2, Object obj)

what arg1 arg2 obj分别对应Message中的相应成员变量。

等价于:

1
2
3
4
5
Message msg = handler.obtainMessage();
msg.arg1 = 1;
msg.arg2 = 2;
msg.what = 3;
msg.obj = Object;

在Handler中接收

1
2
3
4
5
6
7
8
9
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//接收Message发送的消息 msg.what msg.arg1 msg.arg2 msg.obj
//这里msg.obj需要强转成你传过来的数据类型

}
};

并且这样获得的Message不用再重新定义相应的值,十分好用。

一般来讲,what是用来switch不同的操作,而其他3个参数都是定义属性。

要注意的是,具有两个参数的方法只有一个,且第二个参数是Object而不是arg1。

并且如果在2个参数的方法中,将第二个参数填写为本应该设置为arg1的值(int)时候,也不会报错,因为:

  1. arg1有缺省值0
  2. int型可以被自动转化为Integer
    但是arg1的值却被赋给了msg,obj 所以在Handler中的arg1值就为0了