软引用和弱引用

背景: 代码中应用到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()获取上下文对象,就很容易实现了.

内存优化的主题恒久不变,需要持之以恒的寻找方法总结经验.

你可能感兴趣的:(软引用和弱引用)