Handler之Message详解

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(); // 不可忘!
    } }}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容