handler(一)

117 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

1.handler

Handler是Android SDK来处理异步消息的核心类。

子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。

2、handler的作用

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

(1)传递消息Message

消息的创建方式一共有两种,分别是:

//1.通过handler实例获取
Handler handler = new Handler();
Message message=handler.obtainMessage();
 
//2.通过Message获取
Message message=Message.obtain();
}

其中,通过源码来观察的话,通过handler的实例来获取message的方式,也是在内部执行了第二种方式通过message来获取的

public final Message obtainMessage(){
    return Message.obtain(this);

在使用Message时,最好不要直接的new 一个新的Message,这样会占用非常多的内存,因为Message内部的话,有一个Message缓存池,我们在需要使用Message的时候可以直接在消息池中obtain获得消息,然后不使用后,系统会调用ecycle回收message进入消息池中,如果我们不断的new message的话,就会十分占用内存。


Bundle bundle = new Bundle();
bundle.putString("msg", "传递消息");

//发送数据
Message message = Message.obtain();
message.setData(bundle);   
message.what = 0x00;
handler.sendMessage(message);
 
 
//接收数据
final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0x00) {
                Bundle bundle = msg.getData();
                String date = bundle.getString("msg");
            }
        }
};

(2)子线程通知主线程更新ui

        //创建handler
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 0x00) {
                    //更新ui
                          ......
                }
            }
        };
 
        new Thread(new Runnable() {
            @Override
            public void run() {       
                message.what = 0x00;     
                handler.sendMessage(message);  
            }
        }).start();