说到内存泄漏,可能首先就想到创建非静态Handler内部类,导致Handler持有外部Activity引用
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
}
}
网上有很多说处理方法有两种
1.使用静态内部类,也就是
static class MyHandler extends Handler{
}
2.使用弱引用,不让他持有activity的强引用,让Activity能够被及时回收
static class MyHandler extends Handler{
private WeakReference<NoLeakActivity> mActivity;
public NoLeakHandler(NoLeakActivity activity){
mActivity = new WeakReference<>(activity);
}
}
!!!注意,第二种使用弱引用在这里并不是解决泄漏方式,他就算写了弱引用持有,内部类本身默认还是会持有外部类的强引用,而且静态内部类已经解决了内部类持有外部类引用问题。
弱引用在这里的意义
1.能够在handler处理过程中避免activity早已销毁的情况,可以判断activity是否为空,决定是否继续执行原任务
static class MyHandler extends Handler{
private WeakReference<NoLeakActivity> mActivity;
public NoLeakHandler(NoLeakActivity activity){
mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
//Activity已销毁,取消任务
if(mActivity == null) {
return;
}
}
}
2.由于我们使用的是静态内部类Handler,无法访问外部非静态属性和方法,获取到Activity引用,这样就可以调用了,同时避免持有强引用导致无法及时回收。
之前被一些博客误导了,结果被人问起,尴尬了,还是没有深入思考惹的祸。