Android 线程之Message 的使用

来源:互联网 发布:中山大学mba 知乎 编辑:程序博客网 时间:2024/06/06 23:24

                     Android 线程之Message 的使用

Message 为消息对象,就是记录消息信息的类用来承载传递的信息,并且将消息传递到消息队列中。

关于message的使用提供了许多重载的方法,如下:

           Message msg = Message.obtain();

  handler.sendMessage(msg);

分析obtain的源码:

 public static Message obtain() {

        synchronized (sPoolSync) {

            if (sPool != null) {

                Message m = sPool;

                sPool = m.next;

                m.next = null;

                sPoolSize--;

                return m;

            }

        }

        return new Message();

}

分析可以得出,obtain()方法并不会直接创建一个消息, 而是检查消息池中是否有,有的话直接拿过来使用,否则才会重新创建。这样就提高了资源的利用。

第二种:

 Message msg = Message.obtain(handler);

 msg.sendToTarget();

public static Message obtain(Handler h) {

        Message m = obtain();

        m.target = h;

        return m;

    }

指定一个Handler 对象,在其内部 仍然须执行obtain()返回一个消息对象, msg.sendToTarget(); 实际上也是将当前的消息发送到消息队列中。

也可以在构造方法中指定一次发送多个消息

Message msg = Message.obtain(handler, 33, 44, 555, "hello");

msg.sendToTarget();

也可以发送一个复杂类型的数据:

Bundle bundle = new Bundle();

bundle.putStringArray("wang",

new String[] { "jack", "rose", "tom" });

msg.setData(bundle);

接收消息在handler中的 

public void handleMessage(android.os.Message msg) {};

方法中接收消息队列中的消息。

private Handler handler = new Handler() {

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();

System.out.println("----->" + bundle.getStringArray("wang").length);

};

};

 

0 0