这是我参与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();