首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android LruCache技术原理

概述 记得在很早之前,我有写过一篇文章Android高效加载大图、多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache...但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。...Doc中并没有对DiskLruCache的用法给出详细的说明,而网上关于DiskLruCache的资料也少之又少,因此今天我准备专门写一篇博客来详细讲解DiskLruCache的用法,以及分析它的工作原理...前面我们所学的size()方法可以获取到当前缓存路径下所有缓存数据的总字节数,其实它的工作原理就是把journal文件中所有CLEAN记录的字节数相加,求出的总合再把它返回而已。...感兴趣的朋友请继续阅读 Android照片墙完整版,完美结合LruCache和DiskLruCache 。

1K60

LruCache解析

LruCache的介绍 LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap中,当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作...LruCache的使用 // 设置LruCache缓存的大小,一般为当前进程可用容量的1/8 int cacheSize = (int) (Runtime.getRuntime().totalMemory...() / 8); LruCache mMemoryCache = new LruCache(cacheSize) { // 重写...LruCache的实现原理 LruCache的核心思想:维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没有访问的对象,将放在队头,最早被淘汰,而最近访问的对象将放在队尾,最晚被淘汰...LruCache的实现是使用LinkedHashMap来维护这个对象队列的。

74520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    LruCache源码解析

    今天我们来聊聊缓存策略相关的内容,LruCache应该说是三级缓存策略会使用到的内存缓存策略。今天我们就来扒一扒这里面的原理,同时也温故温故我们的数据结构方面的知识。...来实现,我们首先看下LruCache的成员变量和构造函数: public class LruCache { private final LinkedHashMap map...我们刚才看到LruCache构造函数里面LinkedHashMap的初始化的第三个参数accessOrder被赋值为true是什么意思呢?...到这里我们已经明白了LinkedHashMap的工作原理了,那么我们接下来就来看看LruCache的源码了。...LruCache源码 熟悉了LinkedHashMap的数据结构,我们就很容易知道怎么用这个来实现LRU算法了,我们先来看看LruCache的get()方法的源码: public final V get

    79670

    【Android 应用开发】LruCache 简介

    文章目录 LruCache 应用场景 LruCache 算法原理 LruCache 实现 LruCache 参考 LruCache 应用场景 ---- 1....LruCache 引入 : 那么如何确定删除缓存中的哪些数据呢 , 这里就需要用到 LruCache 了 ; LruCache 算法原理 ---- LRU ( Least Recently Used 最近最少使用...缓存空间没有满 : 如果缓存空间没有满 , 直接将元素放在队首 ; 缓存队列中 , 队尾的元素就是最近最少使用的元素 , 因为其一旦使用就会提升到队首 , 因此当缓存满了以后 , 就删除队尾的元素 ; LruCache...Android 中的 LruCache : 其缓存空间就是一个 LinkHashMap 链表 , 当调用 put 方法向其中放入新元素时 , 就会判断这个 LinkHashMap 链表是已满 , 如果没有空间...参考 ---- LruCache 参考 : ① Android LruCache 文档 ② 谈谈LruCache算法的底层实现原理及其内部源码 ③ 完全解析Andorid的缓存机制LruCache

    48330

    Android缓存机制——LruCache的详解

    概述 LruCache的核心原理就是对LinkedHashMap的有效利用,它的内部存在一个LinkedHashMap成员变量,值得注意的4个方法:构造方法、get、put、trimToSize LRU...LRU原理 LruCache的核心思想很好理解,就是要维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没访问的对象,将放在队头,即将被淘汰。...(队尾添加元素,队头删除元素) LruCache 其实使用了 LinkedHashMap 双向链表结构,现在分析下 LinkedHashMap 使用方法。...4. get方法 当调用LruCache的get()方法获取集合中的缓存对象时,就代表访问了一次该元素,将会更新队列,保持整个队列是按照访问顺序排序。...也就是说: 这个方法的作用就是将刚访问过的元素放到集合的最后一位 总结: LruCache的核心原理就是对LinkedHashMap 对象的有效利用。

    93140

    【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一、Bitmap 内存缓存策略 二、LruCache 内存缓存 三、LruCache 常用操作 四、LruCache 工具类 五、源码及资源下载 官方参考 : Google 官方提供的 内存优化参考...LruCache 简介 : 内存缓存一般使用 LruCache , 在 【Android 应用开发】LruCache 简介 博客中有简要介绍 ; ① LRU 算法 : LruCache 使用 LRU (...Least Recently Used 最近最少使用 ) 算法 , 其内部维护了一个 LinkedHashMap 队列 ; ② LRU 数据淘汰原理 : 最近最少使用的数据 , 将会被淘汰 ; ③ LRU...创建 LruCache : ① 指定内存 : 创建 LruCache 时 , 需要指定该缓存的最大内存 , 一般是 APP 可用内存的 1/8 ; ② 实现移除回调方法 : 由于内存紧张 , LruCache...() ; 四、LruCache 工具类 ---- LruCache 缓存 Bitmap 工具类 : package kim.hsl.bm.utils; import android.app.ActivityManager

    2.1K20

    漫谈 LevelDB 数据结构(三):LRU 缓存( LRUCache

    说回 LevelDB 源码,作为一个工业品,它使用 的 LRUCache 又做了哪些优化和变动呢?下面让我们一块来拆解下 LevelDB 中使用的 LRUCache,看看有什么不同。...本文首先明确 LRUCache 的使用方法,然后总览分析 LRUCache 的实现思路,最后详述相关数据结构的实现细节。...缓存使用 在分析 LRUCache 的实现之前,首先了解下 LRUCache 的使用方法,以明确 LRUCache 要解决的问题。...数据结构 LRUCache 实现主要涉及到了四个数据结构:LRUHandle、HandleTable、LRUCache 和 ShardedLRUCache。...LRUCache—— 哈希表索引+双向环形链表 将之前分析过的导出接口 Cache 所包含的函数去掉后,LRUCache 类简化如下: class LRUCache { public: LRUCache

    1.1K30

    【设计数据结构】实现一个 LRUCache

    实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,...lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get...(1); // 返回 1 lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3} lRUCache.get(2); // 返回 -1 (未找到...) lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get...题目让我们实现一个容量固定的 LRUCache 。如果插入数据时,发现容器已满时,则先按照 LRU 规则淘汰一个数据,再将新数据插入,其中「插入」和「查询」都算作一次“使用”。 可以通过 ?

    67930

    数据结构界的“六脉神剑”:数组、链表、哈希表、栈、队列、树的终极解析与实战演练

    这六种数据结构,每一种都有其独特的运行原理和应用场景,它们是编程高手的必备技能。一、数组:数据的连续存储运行原理:数组是最基本的数据结构,它将数据元素连续存储在内存中,通过下标直接访问。...二、链表:数据的非连续存储运行原理:链表中的每个元素包含数据部分和指向下一个元素的指针。应用场景:适用于频繁插入和删除数据的场合。...运行原理:缓存系统通常使用最近最少使用(LRU)算法来确定哪些数据应该被替换。我们使用哈希表来快速定位数据,使用双向链表来维护数据的顺序。...lruCache = new LRUCache(2); lruCache.put(1, 1); // cache is {1=1} lruCache.put(2, 2);...(lruCache.get(3)); // returns -1 (not found) System.out.println(lruCache.get(4)); // returns 4

    21610

    Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

    另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃,所以我这里用得是LruCache...来缓存图片,当存储Image的大小大于LruCache设定的值,系统自动释放内存,这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar...;   public class ImageDownLoader {   /**      * 缓存Image的类,当存储Image的大小大于LruCache设定的值,系统自动释放内存      ...分配1/8 4M         mMemoryCache = new LruCache(mCacheSize){   //必须重写此方法,来测量Bitmap的大小...,LruCache没有就去sd卡或者手机目录查找,在没有就开启线程去下载      * @param firstVisibleItem      * @param visibleItemCount

    1.2K100
    领券