在Android應用的開發(fā)中,為了防止內(nèi)存溢出萨西,在處理一些占用內(nèi)存大而且聲明周期較長的對象時候濒持,可以盡量應用軟引用和弱引用技術佑笋。
軟/弱引用可以和一個引用隊列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對象被垃圾回收器回收枫振,Java虛擬機就會把這個軟引用加入到與之關聯(lián)的引用隊列中喻圃。利用這個隊列可以得知被回收的軟/弱引用的對象列表,從而為緩沖器清除已失效的軟/弱引用粪滤。
假設我們的應用會用到大量的默認圖片斧拍,比如應用中有默認的頭像,默認游戲圖標等等额衙,這些圖片很多地方會用到饮焦。如果每次都去讀取圖片,由于讀取文件需要硬件操作窍侧,速度較慢县踢,會導致性能較低。所以我們考慮將圖片緩存起來伟件,需要的時候直接從內(nèi)存中讀取硼啤。但是,由于圖片占用內(nèi)存空間比較大斧账,緩存很多圖片需要很多的內(nèi)存谴返,就可能比較容易發(fā)生OutOfMemory異常煞肾。這時,我們可以考慮使用軟/弱引用技術來避免這個問題發(fā)生嗓袱。以下就是高速緩沖器的雛形:
首先定義一個HashMap籍救,保存軟引用對象。
private Map <String, SoftReference<Bitmap>> imageCache = new HashMap <String, SoftReference<Bitmap>> ();
使用軟引用以后渠抹,在OutOfMemory異常發(fā)生之前蝙昙,這些緩存的圖片資源的內(nèi)存空間可以被釋放掉的,從而避免內(nèi)存達到上限梧却,避免Crash發(fā)生奇颠。
如果只是想避免OutOfMemory異常的發(fā)生,則可以使用軟引用放航。如果對于應用的性能更在意烈拒,想盡快回收一些占用內(nèi)存比較大的對象,則可以使用弱引用广鳍。
另外可以根據(jù)對象是否經(jīng)常使用來判斷選擇軟引用還是弱引用荆几。如果該對象可能會經(jīng)常使用的,就盡量用軟引用赊时。如果該對象不被使用的可能性更大些伴郁,就可以用弱引用。