欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Handler消息传递机制

程序员文章站 2022-07-14 16:43:34
...

1. Handler消息处理类


将Message或Runnable应用post()或sendMessage()发送到MessageQueue中,当MessageQueue循环到该Message时,调用相应的Handler对象的HandlerMessage()进行处理。

//创建Message,推荐第二种,从Message Pool直接提取,不浪费内存
Message msg = new Message();
Message msg = handler.obtainMessage();
/*发送Message的几种方式*/
//第一种
msg.what = 0x1;
Bundle bundle = new Bundle();
bundle.putString("key", "value");
msg.setData(bundle);
handler.sendMessage(msg);
//相应的提取
String str = msg.getData().getString("key");

//第二种
int what = 0x1;
handler.obtainMessage(what, "obj").sebdToTarget();
//提取
String str = msg.obj().toString();


//发送Runnable类
Runnable run = new Runnable(){...};
int delay = 1000;//毫秒
handler.post(run);//立即发送,run对象封装为Message对象
handler.postDelay(run, delay);//延时发送
handler.postAiTime(run, time);//定时发送

//消息处理回调
handler = new Handler() {
    public void handlerMessage(Message msg) {
        if (msg.what == 0x1)
        ...
    }
};

2. 非主线程中创建Handler


需要使用Looper类的prepare()来初始化一个Looper对象

public class LooperThread extends Thread {
    public Handler handler;
    @Override
    public void run() {
        super.run();
        Looper.prepare();//初始化Looper对象
        handler = new Handler() {
            public void handlerMessage(Message msg) {}
        };
        Message msg = handler.obtainMessage();
        msg.what = 0x1;
        handler.sendMessage(msg);
        Looper.loop();//启动Looper
    }
}