我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android内存优化之内存缓存

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android内存优化之内存缓存

  什么是缓存?   缓存技术原理是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找用户要访问的对象如果找到直接返回这个对象,如果没有找到则再去全集中查找。当然了我这里说的只是原理性的东西,缓存是有很多算法的,并且有的不止一级缓存,这里不过多讲了。   为什么要用到缓存?   有缓存的话可以不必每次从源地址读取文件,既节省了时间也节省了流量。尤其是手机设备,频繁的访问网络资源会消耗很多用户的流量和电量,这是用户不能忍受的,所以无论从哪个方面考虑应用程序都必须加上缓存。   Android中的图片缓存有哪些?各有什么特点?   Android设备的图片缓存分两种,一种是内存缓存,图片缓存在设备的内存中,一种是外部缓存,图片缓存在磁盘上,磁盘可以是内部的存储空间也可以是外部的sd卡。这两种缓存各有各的优点,内存缓存优点是快,缺点是因为也是读取到内存中所以也会消耗内存,所以不能太大,用的时候要考虑分配的空间,还有一个缺点是应用重启后会消失。外部缓存的优点是可以长久保存大量的数据(相比较内存缓存而言),缺点是慢。   内存缓存:   在Android中官网推荐使用LruCache作为内存缓存,LruCache实际上是一个LinkedHashMap( 补充知识:LinkedHashMap是一个双向循环列表,不支持线程安全,LruCache对它进行了封装添加了线程安全操作),里面保存了一定数量的对象强引用,每次添加的新对象都是在链表的头,当分配的空间用完的时候会把末尾的对象移除,移除的对象可以被gc回收了。这里需要注意一下LruCache的容量,这个容量既不能太大,会造成OOM,又不能太小,起不到缓存的作用。google官网给出一下意见作为参考:   分配LruCache大小的时候考虑你的应用剩余内存有多大;   一次屏幕显示多少张图片,有多少张图片是缓存起来准备显示的;   考虑你的手机分辨率和尺寸, 缓存相同的图片个数,dpi越大的手机需要的内存会越大;   图片分辨率和像素质量也决定了占用内存的大小;   图片访问的频繁程度是多少,是不是有一些图片是经常访问的?如果存在你可以考虑用多个·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;   }   };   注意:有同学可能会问下面的代码:   intcacheSize=4*1024*1024;// 4MiB   LruCachebitmapCache=newLruCache(cacheSize){   protectedintsizeOf(Stringkey,Bitmapvalue){   returnvalue.getByteCount();   }   }   这两个sizeOf的计算是不一样的,这里说明一下,这个方法重写的目的是返回图片占用的缓存空间而不是图片的数目,并且这个数值的单位要和cacheSize一样。   总结:   综合上面的讲解,在使用内存缓存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。


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android内存优化之内存缓存

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android内存优化之内存缓存

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

android内存优化之图片优化

对图片本身进行操作。尽量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成decode后,最终都是通过java层的createB
2022-06-06

Android性能优化之内存泄漏

前言对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary、MAT等工具来检测应用程序是否存在内存泄漏,MAT是一款强
2022-06-06

Android内存优化杂谈

Android内存优化是我们性能优化工作中比较重要的一环,这里其实主要包括两方面的工作: 1、优化RAM,即降低运行时内存。这里的目的是防止程序发生OOM异常,以及降低程序由于内存过大被LMK机制杀死的概率。另一方面,不合理的内存使用会使G
2022-06-06

总结Android App内存优化之图片优化

前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮、背景、动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张
2022-06-06

PHP 内容缓存与优化策略

内容缓存可优化 php 网站响应时间,推荐策略包括:内存缓存:用于高速缓存变量,如 mysql 查询结果。文件系统缓存:用于缓存 wordpress 帖子等内容。数据库缓存:适用于购物车或会话等经常更新的内容。页面缓存:用于缓存整个页面输出
PHP 内容缓存与优化策略
2024-05-01

详解Android性能优化之内存泄漏

综述 内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存。那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity
2022-06-06

Android性能优化之内存优化的示例分析

这篇文章主要介绍Android性能优化之内存优化的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、Android内存管理机制1.1 Java内存分配模型先上一张JVM将内存划分区域的图程序计数器:存储当前线
2023-06-15

详解Android的内存优化--LruCache

概念: LruCache 什么是LruCache? LruCache实现原理是什么? 这两个问题其实可以作为一个问题来回答,知道了什么是 LruCache,就只然而然的知道 LruCache 的实现原理;Lru的全称是Least Recen
2022-06-06

redis是内存缓存吗

是的,redis 是一款内存缓存。它将数据存储在内存中,提供高速读写访问、低延迟,并支持多种数据结构。广泛用于缓存、消息队列、会话管理和排名列表等应用程序中。Redis 是内存缓存吗?是的,Redis 是一个内存缓存。详细说明:Red
redis是内存缓存吗
2024-04-20

Android图片三级缓存策略(网络、本地、内存缓存)

一、简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好。所以一个应用的图片缓存策略是很重要的。通常情况下,Android
2022-06-06

解析Android开发优化之:对Bitmap的内存优化详解

1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还
2022-06-06

Ubuntu释放缓存/内存和显存

前言 深度学习训练模型时,总是出现显存和内存爆满的现象,导致训练中断,这里总结几个好用的方法: 代码添加指令手动释放内存/缓存自动定时释放内存/缓存代码释放显存(torch) 1. 代码添加指令 代码中存在一些临时变量或者缓存,使用del
2023-08-20

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录