背景: 代码中应用到AsyncTask,由于所在activity需要被打开较多(条目数)次,为了避免OOM所以要进行优化,在网上找了很多资料,大体就是说内部类会有外部类的引用,即: 当activity销毁的时候,由于AsyncTask的实例拥有activity的引用,所以activity所持有的资源不会立即释放,造成内存泄露.为了解决这个问题,在网上搜集了很多资料:
1)资源文件以及activity中用到的属性在onDestroy中置空(null)
2)在AsyncTask中使用activity的弱引用
经过测试,第二个方法,可以很好的解决内存泄露问题,所以总结一下.
1. SoftReference:软引用–>当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法获得上下文对象(把软引用看做一个较强的弱引用).
2. WeakReference:弱引用–>随时可能会被垃圾回收器回收,不一定要等到虚拟机内存不足时才强制回收。要获取对象时,同样可以调用get方法。
方法: 将继承自AsyncTask的子类声明成static类型,添加构造方法,传入activity的实例,在内部,activity的接收时:
private static classQueryTaskextendsAsyncTask {
privateWeakReferenceactivity;
publicQueryTask(QcYanShouListActivity activity) {
this.activity=newWeakReference(activity);
}
....
}
在静态内部类里面使用activity.get()获取上下文对象,就很容易实现了.
内存优化的主题恒久不变,需要持之以恒的寻找方法总结经验.