1. 程式人生 > >Android記憶體快取之LruCache

Android記憶體快取之LruCache

LruCache是什麼?

    LruCache 是least recentlly used 的簡稱,意思是最近最少使用演算法,它可以實現將最近最少使用的物件回收掉,從而保證記憶體不會超出範圍可將LruCache當成一個容器,它就相當於一個map集合。

 

為什麼使用LruCache來管理記憶體?

         因為從Android 2.3以後,垃圾回收機制會更傾向於回收持有軟引用和弱引用的物件,也就是說可能在記憶體充足的情況下也會回收軟引用或弱引用,這樣就是失去了記憶體快取的意義,而這個時候就可以使用LruCache來管理記憶體 , LruCache就是一個解決記憶體溢位的類,它能夠自己控制記憶體大小,從而避免記憶體溢位。

 

 

怎麼使用LruCache來進行記憶體快取的管理?

         

package com.casic.bitmaputils.utils;

import android.graphics.Bitmap;
import android.util.Log;
import android.util.LruCache;

/**
 * @author 郭寶
 * @project: BitmapUtils
 * @package: com.casic.bitmaputils.utils
 * @date: 2018/10/28 0028 13:11
 * @brief: 記憶體快取(利用軟引用加以優化)
 */

public class MemoryCacheImagesUtil {

    private static final String TAG = "MemoryCacheImagesUtil";

    //二級優化
    private LruCache<String,Bitmap> mLruCache ;


    //二級優化
    public MemoryCacheImagesUtil(){

        //獲取Android系統給App分配的執行記憶體, 返回的資料以B為單位
        long maxMemory = Runtime.getRuntime().maxMemory();
        Log.i(TAG,"maxMemory:"+maxMemory);
        //maxMemory:402653184

        mLruCache = new LruCache<String,Bitmap>((int) (maxMemory/8)){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                //獲取每張圖片的總位元組大小
                int byteCount = value.getByteCount();
                return byteCount;
            }
        };  
    }


    /**
     * 設定記憶體快取
     * 設定記憶體快取時首先需要在網路下載成功以後設定下,然後在獲取本地快取時設定下
     * @param url
     * @param bitmap
     */
    public void setMemoryCache(String url,Bitmap bitmap){

        //二級優化
        mLruCache.put(url,bitmap);

    }

    /**
     * 根據url獲取記憶體快取中的bitmap物件
     * @param url
     * @return
     */
    public Bitmap getMemoryCache(String url){

        /*
        * 二級優化
        * */
        return mLruCache.get(url);
    }

}