`

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

 
阅读更多
什么是缓存?

缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找用户要访问的对象如果找到就直接返回这个对象,如果没有找到则再去全集中查找。当然了我这里说的只是原理性的东西,缓存是有很多算法的,并且有的不止一级缓存,这里就不过多讲了。

为什么要用到缓存?

有缓存的话可以不必每次从源地址读取文件,既节省了时间也节省了流量。尤其是手机设备,频繁的访问网络资源会消耗很多用户的流量和电量,这是用户不能忍受的,所以无论从哪个方面考虑应用程序都必须加上缓存。

Android中的图片缓存有哪些?各有什么特点?

Android设备的图片缓存分两种,一种是内存缓存,图片缓存在设备的内存中,一种是外部缓存,图片缓存在磁盘上,磁盘可以是内部的存储空间也可以是外部的sd卡。这两种缓存各有各的优点,内存缓存优点是快,缺点是因为也是读取到内存中所以也会消耗内存,所以不能太大,用的时候要考虑分配的空间,还有一个缺点是应用重启后就会消失。外部缓存的优点是可以长久保存大量的数据(相比较内存缓存而言),缺点就是慢。

内存缓存:

在Android中官网推荐使用LruCache作为内存缓存,LruCache实际上就是一个LinkedHashMap( 补充知识:LinkedHashMap是一个双向循环列表,不支持线程安全,LruCache对它进行了封装添加了线程安全操作),里面保存了一定数量的对象强引用,每次添加的新对象都是在链表的头,当分配的空间用完的时候会把末尾的对象移除,移除的对象就可以被gc回收了。这里需要注意一下LruCache的容量,这个容量既不能太大,会造成OOM,又不能太小,起不到缓存的作用。google官网给出一下意见作为参考:

1.分配LruCache大小的时候考虑你的应用剩余内存有多大;

2.一次屏幕显示多少张图片,有多少张图片是缓存起来准备显示的;

3.考虑你的手机分辨率和尺寸, 缓存相同的图片个数,dpi越大的手机需要的内存就会越大;

4.图片分辨率和像素质量也决定了占用内存的大小;

5.图片访问的频繁程度是多少,是不是有一些图片是经常访问的?
如果存在你可以考虑用多个LruCache来做缓存,按照访问的频率度分配到不同的LruCache中;

如何平衡一下图片质量和数量,有些时候可以考虑缓存低分辨率的图片,用到的时候再在后台请求更高质量的图片;

总之你分配的LruCache大小既不能太大,又不能太小,具体到应用中还要你综合考虑。

使用LruCache的例子:

private LruCache<String, Bitmap> mMemoryCache;//声明缓存空间

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);//获取应用在系统中的最大内存分配

//分配1/8的应用内存作为缓存空间

final int cacheSize = maxMemory / 8;

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {

@Override
protected int sizeOf(String key, Bitmap bitmap) {
    //重写sizeOf方法,返回图片的占用字节数而不是图片的个数,每次添加图片是会被调用
    return bitmap.getByteCount() / 1024;
}

};


总结:

综合上面的讲解,在使用内存缓存LruCache时你需要知道如下知识:

LruCache封装了LinkedHashMap,提供了LRU(Least Recently Used 最近最少使用算法)缓存的功能;

LruCache通过trimToSize方法自动删除最近最少访问的键值对;

LruCache不允许空键值, LinkedHashMap允许;

LruCache线程安全, LinkedHashMap线程不安全;

继承LruCache时,必须要复写sizeOf方法,用于计算每个条目的大小。在put和get的时候会调用safeSizeOf(K key, V value),safeSizeOf(K key, V value)会调用 sizeOf (K key, V value),这个方法默认返回1。

一款第三方的内测工具对APP进行全方面的检测:http://www.ineice.com/


转自:http://www.codeceo.com/article/android-memory-cache.html












分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android LRUCache机制 缓存机制

    默认情况下,LRUCache的大小是以条目数量衡量的,但开发者可以根据需要覆盖`sizeOf()`方法来改变这种衡量方式,例如按字节数来计算缓存大小: ```java LruCache, Bitmap&gt; bitmapCache = new LruCache, Bitmap&gt;...

    浅谈Android LruCache的缓存策略

    本文主要讨论了Android中的LruCache缓存策略,它是一种高效的内存管理机制,尤其适用于图片或者其他大对象的缓存。 一、Android缓存策略概述 缓存的基本操作包括添加、获取和删除。在Android系统中,内存缓存和...

    Lrucache的相关使用(Android缓存)

    使用`LruCache`时,我们需要继承`LruCache`类,并重写`sizeOf()`方法,该方法用于计算每个键值对的大小。大小可以是字节数、项数或其他适合应用需求的度量单位。例如,如果存储的是Bitmap对象,我们可以根据Bitmap的...

    LruCache缓存demo

    3. **自定义LRUCache**:开发者需要根据自己的需求来指定每个缓存项的大小,可以通过重写`sizeOf()`方法来计算每个条目的内存占用。 4. **使用示例**:在Android应用中,通常会创建一个LRUCache实例,然后将需要...

    android图片墙lrucache oom

    首先,我们需要创建一个继承自`java.util.LinkedHashMap`的类,重写`size()`和`entryRemoved()`方法,以便计算缓存对象的大小并处理移除事件。 ```java public class BitmapLruCache extends LruCache, Bitmap&gt; { ...

    详解Android的内存优化–LruCache.zip

    - 添加数据到缓存时,调用`put(key, value)`方法,其中value的大小需要通过重写`sizeOf()`方法来计算。 - 获取数据时,调用`get(key)`方法,如果缓存中有对应key的数据,会返回该数据,否则返回null。 4. **注意...

    LruCache实现图片缓存

    2. **重写sizeOf方法**: `LruCache`需要知道每个缓存项的大小,以便正确计算总容量。由于Bitmap对象的大小不容易直接获取,我们可以估算其大小。通常,我们可以按位数计算: ```java @Override protected int ...

    Android图片缓存之Lru算法(二)

    // 重写sizeOf方法,计算Drawable的大小 @Override protected int sizeOf(String key, Drawable value) { if (value instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) value).getBitmap(); ...

    LruCache使用

    在Android开发中,LRUCache是Android SDK提供的一种基于LRU算法的内存缓存机制,主要用于高效地管理Bitmap对象,避免因大量图片加载导致内存溢出(OOM)的问题。 **LRUCache的工作原理** LRUCache的核心思想是维护...

    listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存图片

    `LruCache`是Android内置的一种基于最近最少使用原则的内存缓存机制。通过限制缓存的最大容量,当达到上限时,最不常使用的数据会被淘汰。将图片缓存在内存中,下次再显示同一图片时,就可以直接从内存中读取,而...

    LruCache工具类

    LRUCache通过重写`entryRemoved`方法来处理元素被移除时的逻辑,同时通过`size()`方法计算当前缓存占用的内存大小。 下面,我们详细探讨如何使用LRUCache: 1. **创建LRUCache实例**:首先,你需要定义一个...

    Java资源缓存 之 LruCache

    Java资源缓存中的LruCache是一个非常实用的内存缓存机制,特别适用于Android应用程序,尤其是对于频繁加载和显示图片的应用。LruCache是Android Support Library v4中的一个类,它基于LinkedHashMap实现,遵循“最近...

    DisplayingBitmaps

    1. 创建一个继承自LruCache的子类,重写`sizeOf()`方法来确定每个键值对的大小。 2. 初始化LruCache实例,传入总内存大小,通常为应用可用内存的1/4。 3. 使用`put()`方法将Bitmap添加到缓存,`get()`方法获取已缓存...

    Doing More With Less

    在文档中,ThumbnailCache类继承自LruCache,并且重写了sizeOf方法来计算Bitmap对象的内存占用大小,从而保证了缓存的大小控制在合理的范围,防止内存溢出。 文档还提到了如何确定LruCache的大小。通过使用...

    Android Bitmap的加载与缓存

    我们可以通过重写 sizeOf 方法计算每个缓存对象的内存占用。LruCache 是一个泛型类,可以容纳各种对象,因此它无法计算被储存对象的大小。 LruCache 实际上是对 LinkedHashMap 进行了封装并处理了线程安全问题。...

    MyLruCache

    该项目中,开发者首先定义了一个继承自LruCache的自定义类,如`BitmapLruCache`,并重写了`sizeOf()`方法来计算每个Bitmap对象占用的内存大小。然后,在`put()`方法中将图片加载到缓存,而在`get()`方法中尝试从缓存...

    LruCacheTest

    LRUCache(Least Recently Used Cache,最近最少使用缓存)是Android系统提供的一个基于LRU算法的内存缓存机制,常用于数据缓存,优化应用性能。在Android开发中,当我们需要频繁读取某些数据,但又不希望每次都从...

    大图加载展示

    2. **重写sizeOf()方法**: `LruCache`通过`sizeOf()`方法来计算每个条目的大小。对于图片,我们可以计算其位图的像素数量,并将其转换为字节数。 ```java @Override protected int sizeOf(String key, Bitmap ...

    android 加载本地图片

    在Android开发过程中,为了防止因加载大量图片而导致应用程序出现内存溢出(OutOfMemoryError),通常会采用LRUCache(Least Recently Used Cache)来管理图片缓存。这种方式能够有效地减少内存消耗,提高应用性能。...

Global site tag (gtag.js) - Google Analytics