通过软引用解决Handler内存泄露的问题
下面对软引用使用的方式适用于任何内部类,严格来说是通过软引用解决静态内部类无法调用当前类中的对象和方法的问题,真正解决内存泄露是需要将内部类改成静态内部类。
当在一个类中按照如下方式创建一个Handler内部类时,使用Lint工具检测时会给出“This Handler class should be static or leaks might occur”的警告,原因是Handler内部类可能持有当前类的引用,导致即使该类不再被使用时系统仍无法回收这给类持有的对象,Android中内存泄露很多都是由于持有类中的对象时间太长导致,如果很多地方出现类似的代码会导致应用占用的内存不断上涨,最终导致程序崩溃。
private TextView mUserNameTxt = null;
class LoadDataHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 0:{
mUserNameTxt.setText(msg.obj.toString());
}
break;
default:{
}
break;
}
}
}
按照Lint的建议将Handler内部类改成static静态内部类后,由于不可能将当前类的所有全局对象都声明为static对象,所以会报“Cannot make a static reference to the non-static field”的错误,这时候可以使用软引用来解决这个问题