Android 三级缓存(网络+LruCache(原理分析)+DeskLruCache)

深入理解Android中LRU算法的原理与实现 阅读详情

什么是三级缓存

  • 网络缓存, 不优先加载, 速度慢,浪费流量
  • 本地缓存, 次优先加载, 速度快
  • 内存缓存, 优先加载, 速度最快

为什么要使用三级缓存

  • 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了
  • 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响
  • 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知
  • 所以提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量
  • 在Android开发中,如果图片过多,而我们又没有对图片进行有效的缓存,就很容易导致OOM(Out Of Memory)错误。因此,图片的缓存是非常重要的,尤其是对图片非常多的应用。现在很多框架都做了很好的图片缓存处理,如【Fresco】、【Glide】等。

三级缓存原理

  • 首次加载 Android App 时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中
  • 之后运行 App 时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中的图片
  • 总之,只在初次访问新内容时,才通过网络获取图片资源

在具体了解三级缓存的工作原理之前有必要先介绍几个概念。

       实例和对象:

          对象是类的一个实例,创建对象的过程也叫类的实例化。对象是以类为模板来创建的。这样在安卓的底部就会用堆来存储对象的实例,栈来存储类的对象。引用是指某些对象的实例化需要其它的对象实例,比如ImageView的实例化就需要Context对象,就是表示ImageView对于Context持有引用(ImageView holds a reference to Context)。

       垃圾回收机制(GC):
          对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。更细致来讲就是对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向图的方式记录并管理堆中的所有对象,通过这种方式确定哪些对象时“可达”,哪些对象时“不可达”。当对象不可达的时候,即对象不再被引用的时候,就会被垃圾回收。该机制对虚拟机中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证虚拟机中的内存空间,防止出现内存泄露和溢出问题。

       内存泄露:
          当不再需要某个实例后,但是这个对象却仍然被引用,这个情况就叫做内存泄露(Memory Leak)。安卓虚拟机为每一个应用分配一定的内存空间,当内存泄露到达一定的程度就会造成内存溢出。

       内存的引用:
          内存的引用级别包括,强引用、软引用、弱引用、虚引用。强引用是默认的引用方式, 即使内存溢出,也不会回收。软引用(softReference), 内存不够时, 会考虑回收。 弱引用 (WeakReference)内存不够时, 更会考虑回收。虚引用(PhantomReference) 内存不够时, 最优先考虑回收! 一般我们常用到的引用就是强引用,比如引用创建一个成员变量里面的引用。对于GC来说, SoftReference的强度明显低于 SrongReference。SoftReference修饰的引用,其告诉GC:我是一个 软引用,当内存不足的时候,我指向的这个内存是可以给你释放掉的。一般对于这种占用内存资源比较大的,又不是必要的变量;或者一些占用大量内存资源的一些缓存的变量,就需要考虑 SoftReference。对于GC来说, WeakReference 的强度又明显低于 SoftReference 。 WeakReference 修饰的引用,其告诉GC:我是一个弱引用,对于你的要求我没有话说,我指向的这个内存是可以给你释放掉的。虚引用其实和上面讲到的各种引用不是一回事的,他主要是为跟踪一个对象何时被GC回收。在android里面也是有用到的:FileCleaner.java 。这些避免内存溢出的引用方式在Android 2.3+的版本上已经不再起太大作用, 因为垃圾回收器会频繁回收非强引用的对象, Android官方建议使用LRUCache。所以当我们用软引用进行内存缓存时会发现内存中的资源会被系统频繁回收。最终是从本地进行读数据。

        这样我们就能很好的理解要三级缓存了。首先,在内存读数据。内存中读数据需要用到最近最少引用算法(lrucache)。Lrucache算法要求为new LruCache<String, Bitmap>()传入一个分配给软件的最大内存,同时重写sizeof()方法,计算每一张图片的大小。这样就可以直接调用LruCache的put()和get()方法。当发现内存中没用数据是时,找到SD卡中的存储文件。通过Bitmap的compress()方法向文件夹中写数据,通过位图工厂BitmapFactory的decodeStream()读取数据,同时可以为decodeStream()方法传入options参数,缩小图片。最后如果,本地仍然没有获取数据,在从网络获取。网络获取数据可以用异步任务来执行(耗时操作不能再主线程中执行)。异步任务需要重写onPostExecute()方法和doInBackground()方法。doInBackground()方法中访问网路,这里用到的是Httpurlconnection,通过连接得到输入流,利用位图工厂转换成位图,返回。onPostExecute()方法在doInBackground()方法执行后执行,传入的参数数doInBackground()方法的返回值。

代码实现我在这块就不多讲了,网上一搜一大堆都可以用,接下来我来讲讲LruCache(算法);


LruCache:最近最少引用算法  ,什么意思呢,  因为是缓存所以往里面放数据 1 2 3 4 5  第一次看 是1 2 3 4 5  如果指定看 2那么就成了 21345  就是进次看的放前面,不看的放后面,因为LruCache的缓存有大小限制 在往里面存放,内存满的话后面的5 会自动被回收,这样就非常的实用,举个例子,比如淘宝,搜索的最多的类型会经常看到,没搜索的不会看到!LruCache源码里面是一个LinkedHashMap,自带一个‘有道’哪里不会划哪里,非常简单!

DeskLruCache:

我们知道为了防止多图OOM的核心解决思路就是使用LruCache技术。但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)。只可惜,Android Doc中并没有对DiskLruCache的用法给出详细的说明,而网上关于DiskLruCache的资料也少之又少,因此今天我准备专门写一篇博客来详细讲解DiskLruCache的用法,以及分析它的工作原理,那么我们先来看一下有哪些应用程序已经使用了DiskLruCache技术。在我所接触的应用范围里,Dropbox、Twitter、网易新闻等都是使用DiskLruCache来进行硬盘缓存的,其中Dropbox和Twitter大多数人应该都没用过,那么我们就从大家最熟悉的网易新闻开始着手分析,来对DiskLruCache有一个最初的认识吧。

相信所有人都知道,网易新闻中的数据都是从网络上获取的,包括了很多的新闻内容和新闻图片

但是不知道大家有没有发现,这些内容和图片在从网络上获取到之后都会存入到本地缓存中,因此即使手机在没有网络的情况下依然能够加载出以前浏览过的新闻。而使用的缓存技术不用多说,自然是DiskLruCache了

其实DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径。选择在这个位置有两点好处:第一,这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题。

详细可以看:https://blog.youkuaiyun.com/guolin_blog/article/details/28863651

Quantum Espresso Hands-On实战训练(四)——PDOS计算与轨道分析 本文详细介绍了Quantum Espresso中PDOS计算与轨道分析的实战方法,重点解析了PDOS在材料电子结构研究中的核心价值,包括原子级分辨率、轨道级解析和自旋极化分析。通过具体案例和操作步骤,帮助读者掌握从输入文件准备到结果解读的全流程,并提供了高级分析技巧和疑难问题解决方案。 阅读详情

相关推荐

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1328

Android之LRU算法

LRU算法简介 LRU 全称是 least recently used,意为“最近最少使用”,说白了就是一种淘汰算法,当有新的元素插入进来的时候,我们的使用空间又有限的时候,就需要淘汰旧的元素,这时候就会选择淘汰最近最少使用的元素。 应用场景 在app开发中,假设有一个页面列表需要从网络获取大量图片,在页面切换、滑动中,同一张图片不可能每次都去网络获取,这样对内存、性能和用户体验都是一...

LVXIANGAN的专栏 2044

金蝶K3系统物料主数据后台表对应字段一览

我们说到物料表,一般是指t_icitem,但正确的说t_icitem并不是一张有,而是一张视图,不过我们对于数据库物料表中的大部分操作,都是通过此视图来完成。比如经常通过此视图,来成批修改数量,单价精度,是否启用批次等一些字段,有的时候,对于账套已经启用,并且已经有业务发生的物料,有一些关键属性也需要通过修改物料表t_icitem来进行。 当然修改的时候,需要考虑一些前提条件的。 比如说我有一个客户新建的账套,在月底结账时发现,要改一种成本核算方法,启用时用的是加权平法,现在想改成移动平均法,这样的情况,

hzfw2008的博客 1万+

Android 内存缓存框架 LruCache 的实现原理

大家好,我是小彭。在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 LUR 算法的数据结构 LinkedHashMap。当时,我们使用 LinkedHashMap 实现了简单的 LRU Demo。今天,我们来分析一个 LRU 的应用案例 —— Android 标准库的 LruCache 内存缓存。

Dream It Possible 2348

贝叶斯校准在计算机模型不确定性分析中的实践指南

本文深入探讨了贝叶斯校准在计算机模型不确定性分析中的核心原理与实践方法。通过将模型从“黑箱”转变为“透明箱”,该方法系统量化了参数不确定性、模型结构缺陷及观测误差。文章重点阐释了如何利用高斯过程作为代理模型和模型不足函数,构建完整的贝叶斯校准框架,并提供了从数据准备、模型训练到MCMC推断及不确定性分析的实战指南,最终实现更可靠的预测与决策支持。

weixin_29088655的博客 292

Unity工业数据可视化:基于ModbusTCP的实时数据通信实战

本文详细介绍了在Unity中实现工业数据可视化的核心方法,重点讲解了基于ModbusTCP协议与PLC等工业设备进行实时数据通信的实战流程。内容涵盖NModbus库的集成、Modbus Slave模拟器的使用、TCP连接的建立与多线程安全通信、数据读写与解析,以及如何将实时数据驱动3D场景,为构建工业数字孪生与监控系统提供完整解决方案。

ol7890123的博客 554

Android中的缓存策略--LruCache

一、Android中的缓存策略一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。因此LRU(Least Recently Used)缓存算法便应运而生,LRU是近期最少使用的算法,它的核心思想

u014732103的博客 1955

手把手教你学Simulink--控制执行场景实例:基于Simulink的智能车辆自动紧急制动(AEB)仿真

本文完成了基于 Simulink 的智能车辆自动紧急制动(AEB),实现了:✅ 构建前车急刹与静止障碍物典型场景✅ 设计基于 TTC 的三级 AEB 决策逻辑✅ 验证在高风险场景下有效避免碰撞✅ 掌握从风险评估到制动执行的完整安全链✅ 为ADAS 主动安全功能开发奠定基础。

MHD0815的博客 237

LRU算法的今生前世&LruCache在Android中的实现

操作系统中的起源 缓存文件置换机制 现代语言的很多特性都可以在操作系统中找到最初的原型,LRU我们最早也可以在操作系统中找到当初的设计。 “高速缓存是计算机科学中唯一重要的思想” -Bill Joy 我们知道,无论是内存还是硬盘,又或者是我们在各自应用中用到的cache,由于大小固定,因而总会面临空间不足,而需要进行缓存置换(or替换),而替换的原则被我们称为缓存文件置换机制。 而今天聊得主题就是:最近最少未使用算法(LRU),即最久没有访问的内容作为替换对象。 页面置换算法 操作系统中,我

许进进的博客 2124

8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术

NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。

烟云的计算 4262

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析(零件转产品)

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析

KE17RS的博客 2145

Android中三级缓存的原理

什么是三级缓存 网络缓存,不优先加载,速度慢,浪费流量 本地缓存,次优先加载,速度快 内存缓存,优先加载,速度最快 为什么要使用缓存 访问内存速度最快 不浪费流量 增强用户体验 三级缓存原理 首次加载App时,要通过网络交互来获取图片,之后我们可以将图片保存在本地SD卡和内存中,之后运行App时,优先访问内存中的图片缓存,如果内存中没有,则加载本地SD卡中的图片,总之,只有在初次访...

HRC0401的博客 926

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Android】LRU 与 Android 缓存策略

本文详细介绍了LRU缓存机制及其实现方式。LRU通过双向链表和哈希表组合实现,保证常数时间操作。同时分析了Android中的LruCache实现,包括容量控制、命中统计和淘汰策略,以及其线程安全的同步机制。最后介绍了DiskLruCache磁盘缓存的使用方法,包括初始化参数和写入流程。这三种缓存方式分别适用于内存和磁盘场景,构成了完整的缓存解决方案。

2401_87853595的博客 621

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android 之 三级缓存(内存!!!、本地、网络)及内存LruCache扩展 及源码分析--- 学习和代码讲解

一. 三级缓存简介如上图所示,目前App中UI界面经常会涉及到图片,特别是像“今日关注”新闻这类app中,图片运用的几率十分频繁。当手机上需要显示大量图片类似listView、gridView控件并且用户会上下滑动,即将浏览过的图片又加载一遍,若是不停的进行网络请求,很快就会OOM,这时三级缓存显得尤为重要,适时地利用资源,进行图片缓存,下面就用一个新闻组图demo进行图片缓存演示。 1.三级缓存

lemonGuo的大脑皮层、小脑、海马体、杏仁核..... 2943

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 开发笔记: LRU 算法的使用

Android 开发学习笔记(一) LRU 算法的使用 关于LRU的定义:  LRU是Least Recently Used 近期最少使用算法。是一种置换算法, 百度百科是这么介绍的:内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出 空间来加载另外的数据。 在Android中的

zhang165849的专栏 571

Android基础知识-LRU算法相关数据结构

https://blog.youkuaiyun.com/justloveyou_/article/details/71713781 一、LinkedHashMap原理 它是一个将所有Entry节点链入一个双向链表的HashMap。 由于LinkedHashMap是HashMap的子类,所以LinkedHashMap自然会【拥有HashMap的所有特性】。 它额外定义了一个以 head 为头节点的双向链表用于保...

笨鸟的专栏 527

Android 三级缓存

Android 三级缓存

ZJQ990909的博客 237

说说Android LRU缓存算法实现笔记(二)--LRU的应用

上一篇文章说说Android LRU缓存算法实现学习笔记(一) 中我们介绍了最常用的实现LRU缓存的数据结构LinkedHashMap,这一节我们会针对LinkedHashMap的数据结构的特性,来自己实现缓存结构和学习Android源码和项目中对缓存的完善。 上一篇说到对于缓存实现,我们很重要的会考虑以下几点:1.访问速度;2.逐出旧的缓存策略;3.最好还能考虑到一定的并发度。

Johnnie Zhang的专栏 2753

如何使用Android的LRU缓存来提升应用性能

示例示例Android 是Android框架中的一个类,用于存储最近最少使用的对象,以便在内存不足时释放内存。Android LruCache是Android框架中的一个类,用于存储最近最少使用的对象,以便在内存不足时释放内存。// 创建一个LruCache实例。// 获取当前缓存大小。

chuyouyinghe的专栏 160

Android 三级缓存 郭霖,Recyclerview缓存机制简析

一 RecyclerView的三级缓存缓存的基本单位是viewholder1.0 mAttachedScrap和mChangedScrappublic final class Recycler {//ArrayList的结构,根据position存取final ArrayList mAttachedScrap = new ArrayList<>();ArrayList mChanged...

weixin_42366319的博客 936

Android 三重缓存

文章目录内存缓存Bitmap内存复用 在 Android 应用中不可避免地要显示很多图片,如果不做处理,不管图片是否显示过,每次启动时都需要从网络拉取,这就极大影响了图片加载速度和浪费用户流量,并且整个应用中的图片内存无法控制在一个总的范围内。因此,图片缓存在一个图片加载模块中很重要并且不可缺少。 目前比较流行的图片框架,如 Glide、Fresco等,都使用了“内存-本地-网络”三级缓存策略。首...

Lud的博客 571

LruCache原理解析

一、Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。 因此LRU(Least Recently Used)缓存算法便应运而生,LRU是最近最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些最近最少使用的缓存对象。采用LRU算法的缓存有两种:LrhCache和DisL

qq_39431405的博客 2550

Android学习总结之算法篇二(LRU、Diffing)

LRU算法,Diffing的算法题目

2301_80329517的博客 394

android lru进程队列,Android 三级缓存 LruCache缓存机制

Android 三级缓存机制:1、内存缓存 (LruCache算法)2、本地缓存 (File存储)3、网络缓存 (网络请求)Android缓存策略:缓存策略一般包括缓存的添加、获取、删除。缓存的添加和获取很容易懂,为什么要删除呢?无论是内存缓存还是硬盘缓存,缓存大小都是有限的,如果缓存满了,想要加进新的缓存,就需要删除一部分缓存,添加新的缓存。LruCache:Least rencently...

weixin_31531599的博客 404

Android 性能优化(十)图片加载和大图片缓存机制OOM完美解决方案LruCache&DiskLruCache

主要的三种方式:图片缩放节约内存,内存缓存,硬盘缓存 一.inSampleSize(缩放值) 经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的       If set to true, the decoder will return null (no bitmap), but t

深南大盗的博客 4039
上一篇: android dialog —— 日期和时间选择对话框
下一篇: 添加Fragment
Android_Code
博客等级 码龄8年 5粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值