Android LruCache

LruCache是一个HashMap和双向链表的数据结构,谷歌在Android3.1(v4 Library也支持)之后提供了一个封装此数据结构实现的LruCache类。

LruCache暴露了三个线程安全的方法get(K)、put(K)和remove(K),通过这三个方法,我们可以操作cache数据。get(K)或者put(K),它们始终都会将K对应的V移到链表头部,这样链表尾部就成为了最久没有使用的数据结点。remove(K)用来删除数据,通过调用entryRemoved(boolean evicted, K key, V oldValue, V newValue)达到进一步的数据清理。

下面是LruCache的简单实用方法:

LruCacheUtil.java

package com.jackie.lrucache;

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

/**
 * Created by Jackie on 2015/9/5.
 */
public class LruCacheUtil {

    private final long MAX_MEMORY = Runtime.getRuntime().maxMemory(); //最大内存,单位byte
    private LruCache mLruCache;

    public LruCacheUtil() {
        mLruCache = new LruCache((int) (MAX_MEMORY / 8)){ // 1/8作为缓存区

            //必须重写,计算图片所占内存的大小,单位需要与构造函数的参数保持一致
            @Override
            protected int sizeOf(String key, Bitmap value) {
                //三种计算size的方法
                //return value.getByteCount();
                //图片行的字节数 * 图片的高
                //return value.getRowBytes() * value.getHeight();
                //图片的长 * 高,得到所有的像素点,然后乘以每个像素点所占的位数
                return value.getWidth() * value.getHeight() * getBytesForConfig(value.getConfig());
            }
        };
    }

    /**
     * 从config中取出byte
     * @param config
     * @return
     */
    private int getBytesForConfig(Bitmap.Config config) {
        switch (config) {
            case ALPHA_8:  //每个像素占1位
                return 1;
            case ARGB_4444: //每个像素占2位
            case RGB_565:  //每个像素占2位
                return 2;
            case ARGB_8888:  //每个像素占4位
                return 4;
        }
        return 0;
    }

    public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (mLruCache.get(key) == null) {
            if (key != null && bitmap != null) {
                mLruCache.put(key, bitmap);
            }
        } else {
            Log.d("Jackie", "The cache is already exists");
        }
    }

    public synchronized void removeBitmapFromMemoryCache(String key) {
        if (key != null) {
            Bitmap bitmap = mLruCache.remove(key);
            if (bitmap != null) {
                bitmap.recycle();
            }
        }
    }

    public synchronized  Bitmap getBitmapFromMemoryCache(String key) {
        return mLruCache.get(key);
    }

    public void clearCache() {
        if (mLruCache.size() > 0) {
            mLruCache.evictAll();
            //mLruCache.trimToSize(-1);
        }
    }
}
使用:
Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ALPHA_8);
new LruCacheUtil().addBitmapToMemoryCache("abc",  bitmap);



你可能感兴趣的:(Android)