缓存LruCache类中sizeOf方法的含义

原创 2017年01月03日 15:37:35

今天做图片缓存,用到lurcache类,设置图片的缓存大小,需要设置缓存的总大小max,就要计算每张图片的大小,sizeOf方法就是计算每张图片byte大小的方法。

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

import com.android.volley.toolbox.ImageLoader;

/**
 * Created by dugaolong on 17/1/3.
 * 作为缓存,肯定有一个缓存的大小,这个大小是可以设定的(自定义sizeOf())。
 * 当你访问了一个item(需要缓存的对象),这个item应该被加入到内存中,然后移动到一个队列的顶部,
 * 如此循环后这个队列的顶部应该是最近访问的item了,
 * 而队尾部就是很久没有访问的item,这样我们就应该对队尾部的item优先进行回收操作。
 */

public class BitmapCache implements ImageLoader.ImageCache {

    private LruCache<String,Bitmap> cache;
    private int max = 10*1024*1024;//最大缓存大小10M,如果缓存超过10M,会自动回收。
    //构造方法
    public BitmapCache(){
        //实例化cache
        cache = new LruCache<String,Bitmap>(max){
            //sizeOf返回的是你缓存的item的大小
            @Override
            protected int sizeOf(String key, Bitmap value) {
//                return value.getRowBytes() * value.getHeight();//计算每张图片的大小
                return value.getByteCount();//计算每张图片的大小
            }
        };
    }
    //返回缓存里的图片
    @Override
    public Bitmap getBitmap(String s) {
        return cache.get(s);
    }

    //吧图片放进缓存
    @Override
    public void putBitmap(String s, Bitmap bitmap) {
        cache.put(s,bitmap);
    }
}

补充:

1、getRowBytes:Since API Level 1,用于计算位图每一行所占用的内存字节数。
2、getByteCount:Since API Level 12,用于计算位图所占用的内存字节数。
经实测发现:getByteCount() = getRowBytes() * getHeight(),也就是说位图所占用的内存空间数等于位图的每一行所占用的空间数乘以位图的行数。
因为getByteCount要求的API版本较高,因此对于使用较低版本的开发者,在计算位图所占空间时上面的方法或许有帮助。


LruCache中sizeof的含义

对一些常用的数据,为了重复去计算,有时候需要做缓存来提高应用性能。一般情况下我们通常会采用Map或SparseArray等键值对数据结构并结合SoftReference或WeakRefenerence...

Android提供的LruCache类简介

package android.util;      import java.util.LinkedHashMap;   import java.util.Map;      /**   ...

Android高效加载大图、多图解决方案,有效避免程序OOM

我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出...

字节、字、bit、byte的关系

字 word 字节 byte 位 bit 字长是指字的长度 1字=2字节(1 word = 2 byte) 1字节=8位(1 byte = bit)   一个字的字长为16 ...

android LruCache内存缓存学习(重写sizeOf方法)

什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找...

【Android 开发】深入理解内存缓存类LruCache:源码分析

ruCache是Android API实现的用于内存缓存的类,LRU即“Leatestrecent used”的缩写,典型应用是集中展示多个BitMap。这里讲解了其源码。...

简析Android中LruCache缓存类

/***************************************************  * TODO: description .  * @author: gao_chun ...

Java缓存的Lru算法实现---并对Android util类LruCache的改进

一、 概述1.LRU算法概述LRU ( Least Recently Used )叫做最近最久未使用算法,它只是的是一种置换策略算法,计算机系统内存中页面置换基本是这算法。其实这算法也不难理解,就是优...

Android源码解析之(七)-->LruCache缓存类

android开发过程中经常会用到缓存,现在主流的app中图片等资源的缓存策略一般是分两级,一个是内存级别的缓存,一个是磁盘级别的缓存。 作为android系统的维护者google也开源了其缓存方案...

LruCache.java这个类用来作为缓存图片是很不错的,源码的分析:

代码片段,双击复制 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:缓存LruCache类中sizeOf方法的含义
举报原因:
原因补充:

(最多只允许输入30个字)