Android图片加载(3)

缓存(LruCache)


为了加快图片加载速度,我们经常需要将已加载好的一定数量的图片存放于内存中,以提高用户体验,这里我们使用LruCache类实现内存缓存。

LruCache类位于android.util包内,可以通过以下代码进行声明:

private android.util.LruCache<String, Bitmap> mMemoryCache;

通过如下函数可以进行LruCache的初始化:

public void initLruCache(){
        // 获取应用程序最大可用内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 8;
        // 设置图片缓存大小为程序最大可用内存的1/8
        mMemoryCache = new android.util.LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getByteCount();
            }
        };
    }

由于缓存区域肯定是固定的,所有我们把LruCache类设计成单例的,详细的LruCache类源码如下所示:

public class LruCache {

    private android.util.LruCache<String, Bitmap> mMemoryCache;
    private static LruCache mLruCache = null;
    private LruCache(){}
//设计成单例模式,保证引用的是惟一的缓存区
    public static LruCache getInstance(){
        if (mLruCache == null){
            mLruCache = new LruCache();
        }
        return mLruCache;
    }

    public void initLruCache(){
        // 获取应用程序最大可用内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 8;
        // 设置图片缓存大小为程序最大可用内存的1/8
        mMemoryCache = new android.util.LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getByteCount();
            }
        };
    }
//设置该函数同步,防止同时有多个线程操作,保护数据的完整,安全。
    public synchronized void addBitmapToLruCache(String key,Bitmap bitmap){
        if (getBitmapFromMemoryCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    }

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

    public void removeBitmapFromLruCache(String key){
        mMemoryCache.remove(key);
    }
    //我没有写清除缓存的代码,大家可以自己写一下很简单的。
}

好了,我们的缓存就讲到这里,这样我们就基本完成了我们工具类的书写,其中第一讲讲的是实体类和MediaProvider,第二讲是PhotoBitmapFactory(生产Bitmap的类),这一讲是缓存工具类,大概可以看出我是从Dao层到Service层讲的,下一讲我们就开始讲具体的异步请求了,把拿到的数据展示出来噻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值