Handler大家都在用,用来线程的通信,实现异步间的信息传递
handler有个小坑 不优化的话 会引起内存泄漏
要从handler机制说起,Android中UI线程也就是主线程建立时,会进行一个Looper.prepare()的方法,每个looper对应一个线程,这是一个类似轮询器的玩意儿,这个东西会不停地去轮询Messagequeue消息队列,取出处于队列头部的消息,发送给相应的线程
大体的一个机制就是这样,然后问题就出在了消息队列这一块,handler发送消息,不是说发送一个就完事,要不然也就用不到消息队列了,假设这样一个情况,消息队列中有五个消息,都是由子线程发送给主线程的,主线程在处理了两个消息之后被用户关闭了,这是很有可能的一个情况,activity关闭是关闭了 但是这个时候handler还持有着activaty的引用,这就会导致activity的内存回收不了,出现内存泄漏
具体优化方法如下 简单的加一个软引用
static class LoadDataHandler extends Handler {
private SoftReference<MainActivity> activitySRF = null;
public LoadDataHandler(MainActivity activity) {
activitySRF = new SoftReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 因为Handler是异步的,存在退出当前类之后才接收到handler消息的情况,
// 并且软引用持有的对象会在堆内存不足时存在被回收的可能,所以这里需要判空处理
if (null == activitySRF || null == activitySRF.get()) {
return;
}
switch (msg.what) {
case 0: {
activitySRF.get().mUserNameTxt.setText("123");
}
break;
default:break;
}
}
}