1. 程式人生 > >Android開發優化方案之軟引用和弱引用的使用

Android開發優化方案之軟引用和弱引用的使用

物件的引用分為四種級別,為了能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。

本篇主要介紹軟引用和弱引用的使用和區別

一、軟引用:SoftReference
如果一個物件只具有軟引用,那麼如果記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些物件的記憶體。即快取空間不夠時才會選擇去回收和釋放部分記憶體。
二、弱引用:WeakReference
如果一個物件只具有弱引用,那麼在垃圾回收器執行緒掃描的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。即只要執行程式中掃描到就會回收和釋放記憶體。

二者的區別:

只具有弱引用的物件擁有更短暫的生命週期,可能隨時被回收。而只具有軟引用的物件只有當記憶體不夠的時候才被回收,在記憶體足夠的時候,通常不被回收。
1、想避免OutOfMemory異常的發生,則可以使用軟引用。如果對於應用的效能更在意,想盡快回收一些佔用記憶體比較大的物件,則可以使用弱引用。
2、根據物件是否經常使用來判斷。如果該物件可能會經常使用的,就儘量用軟引用。如果該物件不被使用的可能性更大些,就可以用弱引用。

應用場景:

當程式中需要使用大量圖片,頻繁讀取會影響手機效能,所以需要做快取處理,而圖片佔用記憶體過大,所以就會出現我們常遇到的OOM異常了,這時我們可以使用軟引用來解決這類問題。
儲存Bitmap的軟引用到HashMap
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();


public void addBitmapToCache(String path) {

        // 強引用的Bitmap物件

        Bitmap bitmap = BitmapFactory.decodeFile(path);

        // 軟引用的Bitmap物件
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap); // 新增該物件到Map中使其快取 imageCache.put(path, softBitmap); }
獲取的時候,可以通過SoftReference的get()方法得到Bitmap物件
public Bitmap getBitmapByPath(String path) {

        // 從快取中取軟引用的Bitmap物件

        SoftReference<Bitmap> softBitmap = imageCache.get(path);

        // 判斷是否存在軟引用

        if (softBitmap == null) {

            return null;

        }

        // 取出Bitmap物件,如果由於記憶體不足Bitmap被回收,將取得空

        Bitmap bitmap = softBitmap.get();

        return bitmap;

    }

參考網址:https://blog.csdn.net/arui319/article/details/8489451