背景: 代碼中應(yīng)用到AsyncTask,由于所在activity需要被打開較多(條目數(shù))次,為了避免OOM所以要進(jìn)行優(yōu)化,在網(wǎng)上找了很多資料,大體就是說內(nèi)部類會(huì)有外部類的引用,即: 當(dāng)activity銷毀的時(shí)候,由于AsyncTask的實(shí)例擁有activity的引用,所以activity所持有的資源不會(huì)立即釋放,造成內(nèi)存泄露.為了解決這個(gè)問題,在網(wǎng)上搜集了很多資料:
1)資源文件以及activity中用到的屬性在onDestroy中置空(null)
2)在AsyncTask中使用activity的弱引用
經(jīng)過測試,第二個(gè)方法,可以很好的解決內(nèi)存泄露問題,所以總結(jié)一下.
1. SoftReference:軟引用–>當(dāng)虛擬機(jī)內(nèi)存不足時(shí)驰后,將會(huì)回收它指向的對(duì)象捷兰;需要獲取對(duì)象時(shí),可以調(diào)用get方法獲得上下文對(duì)象(把軟引用看做一個(gè)較強(qiáng)的弱引用).
2. WeakReference:弱引用–>隨時(shí)可能會(huì)被垃圾回收器回收哭当,不一定要等到虛擬機(jī)內(nèi)存不足時(shí)才強(qiáng)制回收迹辐。要獲取對(duì)象時(shí)呵萨,同樣可以調(diào)用get方法撒犀。
方法: 將繼承自AsyncTask的子類聲明成static類型,添加構(gòu)造方法,傳入activity的實(shí)例,在內(nèi)部,activity的接收時(shí):
private static classQueryTaskextendsAsyncTask {
? ? ? ? ?privateWeakReferenceactivity;
? ? ? ? publicQueryTask(QcYanShouListActivity activity) {
? ? ? ? ? ? ? ? this.activity=newWeakReference(activity);
? ? ? ?}
....
}
在靜態(tài)內(nèi)部類里面使用activity.get()獲取上下文對(duì)象,就很容易實(shí)現(xiàn)了.
內(nèi)存優(yōu)化的主題恒久不變,需要持之以恒的尋找方法總結(jié)經(jīng)驗(yàn).