1.问题场景:
在activity中,直接new一个Handler的内部类对象,赋值给成员变量
private Handler = new Handler(){
handlerMessage(…)...
}
2.问题原因:
handler是子主线程间的桥梁,它的任务时间子线程的打包的Msg送到主线程的消息队列,然后在主线程中执行,然而当activity准备回收前,发现消息队列中有任务正在使用activity的资源,则会导致actiivity无法回收,造成内存泄露
3.解决方法:
将Handler的继承类定义成static类型,然后定义一个弱应用(不影响回收)指向当前activity,在执行任务前先判断activity是否还存在,存在则执行之。
public void handleMessage(Message msg) {
if(mActivity.get()!=null){...}
}
4.代码模板
//注意:此处的赋值应放在周期方法中,否则this可能为空
private Handler mHandler = new MyHandler(this);
static class MyHandler extends Handler {
private final WeakReference<Activity> mActivity;
PrinterHandler(Activity activity){
this.mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
if(mActivity.get()!=null)
//TODO
}
}