- 浏览: 596371 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
什么是缓存?
缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找用户要访问的对象如果找到就直接返回这个对象,如果没有找到则再去全集中查找。当然了我这里说的只是原理性的东西,缓存是有很多算法的,并且有的不止一级缓存,这里就不过多讲了。
为什么要用到缓存?
有缓存的话可以不必每次从源地址读取文件,既节省了时间也节省了流量。尤其是手机设备,频繁的访问网络资源会消耗很多用户的流量和电量,这是用户不能忍受的,所以无论从哪个方面考虑应用程序都必须加上缓存。
Android中的图片缓存有哪些?各有什么特点?
Android设备的图片缓存分两种,一种是内存缓存,图片缓存在设备的内存中,一种是外部缓存,图片缓存在磁盘上,磁盘可以是内部的存储空间也可以是外部的sd卡。这两种缓存各有各的优点,内存缓存优点是快,缺点是因为也是读取到内存中所以也会消耗内存,所以不能太大,用的时候要考虑分配的空间,还有一个缺点是应用重启后就会消失。外部缓存的优点是可以长久保存大量的数据(相比较内存缓存而言),缺点就是慢。
内存缓存:
在Android中官网推荐使用LruCache作为内存缓存,LruCache实际上就是一个LinkedHashMap( 补充知识:LinkedHashMap是一个双向循环列表,不支持线程安全,LruCache对它进行了封装添加了线程安全操作),里面保存了一定数量的对象强引用,每次添加的新对象都是在链表的头,当分配的空间用完的时候会把末尾的对象移除,移除的对象就可以被gc回收了。这里需要注意一下LruCache的容量,这个容量既不能太大,会造成OOM,又不能太小,起不到缓存的作用。google官网给出一下意见作为参考:
1.分配LruCache大小的时候考虑你的应用剩余内存有多大;
2.一次屏幕显示多少张图片,有多少张图片是缓存起来准备显示的;
3.考虑你的手机分辨率和尺寸, 缓存相同的图片个数,dpi越大的手机需要的内存就会越大;
4.图片分辨率和像素质量也决定了占用内存的大小;
5.图片访问的频繁程度是多少,是不是有一些图片是经常访问的?
如果存在你可以考虑用多个LruCache来做缓存,按照访问的频率度分配到不同的LruCache中;
如何平衡一下图片质量和数量,有些时候可以考虑缓存低分辨率的图片,用到的时候再在后台请求更高质量的图片;
总之你分配的LruCache大小既不能太大,又不能太小,具体到应用中还要你综合考虑。
使用LruCache的例子:
总结:
综合上面的讲解,在使用内存缓存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中的图片缓存有哪些?各有什么特点?
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 BaseActivity与BaseFragment的封装
2016-05-19 15:06 10161 概述 多模块Activity+多Fragment 是开发 ... -
android ScrollView常用属性
2016-05-09 09:17 714android:scrollbars 设置滚动条显示。none ... -
android RecyclerView使用及详解
2016-05-04 10:35 29051.前言 话说RecyclerView已经面市很久,也在很多 ... -
android DialogFragment 创建对话框(官方推荐)
2016-04-29 14:22 9141、 概述 DialogFragment在android 3. ... -
android Intent Flags及Task相关属性
2016-04-26 09:15 626task是一个具有栈结构的容器,可以放置多个Activity实 ... -
android SQLite具体实例应用详解(SQLiteOpenHelper)
2016-04-18 19:24 822上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们 ... -
android SQLite3常用命令&语法
2016-04-18 19:01 624sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常 ... -
android View绘制相关问题总结
2016-03-28 19:27 6901.View的绘制流程分几步 ... -
android Handler Looper MessageQueue机制的原理
2016-03-22 21:09 773andriod提供了Handler和Looper来满足线程间的 ... -
android Bitmap,BitmapFactory类图像处理
2016-03-16 16:28 2375BitMap代表一张位图,扩展名可以是.bmp或者.dib。 ... -
android 三类菜单(Option) (Context) (SubMenu)学习
2016-03-14 15:23 929在Android系统中,菜单可以分为三类:选项菜单(Optio ... -
android Sqlite数据库对象模型ORMLite框架学习
2016-03-11 15:24 716在Android项目中或多或少的都会使用数据库,为了提高我们的 ... -
android AsyncTask<参数,进度值类型,返回类型>学习
2016-03-10 14:45 1192AsyncTask和Handler对比 1 ... -
android 远程图片获取和本地缓存
2016-03-10 14:32 786概述 对于客户端——服 ... -
android onSaveInstanceState和onRestoreInstanceState学习
2016-03-10 10:08 807Android中的activity通过onSaveInst ... -
android Fragment生命周期和回退栈学习以及Fragment之间通信
2016-03-10 09:31 1539会涉及到Fragment如何产生,什么是Fragment,Fr ... -
android ListView中的convertView缓存及使用
2016-03-09 19:12 1716一、复用convertView 首先讲下ListView的原 ... -
android 从资源角度谈Android代码内存优化
2016-03-09 18:54 726开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么 ... -
android startActivityForResult和setResult详情及Demo
2016-03-09 08:56 1057startActivityForResult与startAct ... -
android Toast详解以及自定义Toast例子
2016-01-28 14:15 1553Toast的用法 Toast只是一个View视图,快速的为用 ...
相关推荐
默认情况下,LRUCache的大小是以条目数量衡量的,但开发者可以根据需要覆盖`sizeOf()`方法来改变这种衡量方式,例如按字节数来计算缓存大小: ```java LruCache, Bitmap> bitmapCache = new LruCache, Bitmap>...
本文主要讨论了Android中的LruCache缓存策略,它是一种高效的内存管理机制,尤其适用于图片或者其他大对象的缓存。 一、Android缓存策略概述 缓存的基本操作包括添加、获取和删除。在Android系统中,内存缓存和...
使用`LruCache`时,我们需要继承`LruCache`类,并重写`sizeOf()`方法,该方法用于计算每个键值对的大小。大小可以是字节数、项数或其他适合应用需求的度量单位。例如,如果存储的是Bitmap对象,我们可以根据Bitmap的...
3. **自定义LRUCache**:开发者需要根据自己的需求来指定每个缓存项的大小,可以通过重写`sizeOf()`方法来计算每个条目的内存占用。 4. **使用示例**:在Android应用中,通常会创建一个LRUCache实例,然后将需要...
首先,我们需要创建一个继承自`java.util.LinkedHashMap`的类,重写`size()`和`entryRemoved()`方法,以便计算缓存对象的大小并处理移除事件。 ```java public class BitmapLruCache extends LruCache, Bitmap> { ...
- 添加数据到缓存时,调用`put(key, value)`方法,其中value的大小需要通过重写`sizeOf()`方法来计算。 - 获取数据时,调用`get(key)`方法,如果缓存中有对应key的数据,会返回该数据,否则返回null。 4. **注意...
2. **重写sizeOf方法**: `LruCache`需要知道每个缓存项的大小,以便正确计算总容量。由于Bitmap对象的大小不容易直接获取,我们可以估算其大小。通常,我们可以按位数计算: ```java @Override protected int ...
// 重写sizeOf方法,计算Drawable的大小 @Override protected int sizeOf(String key, Drawable value) { if (value instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) value).getBitmap(); ...
在Android开发中,LRUCache是Android SDK提供的一种基于LRU算法的内存缓存机制,主要用于高效地管理Bitmap对象,避免因大量图片加载导致内存溢出(OOM)的问题。 **LRUCache的工作原理** LRUCache的核心思想是维护...
`LruCache`是Android内置的一种基于最近最少使用原则的内存缓存机制。通过限制缓存的最大容量,当达到上限时,最不常使用的数据会被淘汰。将图片缓存在内存中,下次再显示同一图片时,就可以直接从内存中读取,而...
LRUCache通过重写`entryRemoved`方法来处理元素被移除时的逻辑,同时通过`size()`方法计算当前缓存占用的内存大小。 下面,我们详细探讨如何使用LRUCache: 1. **创建LRUCache实例**:首先,你需要定义一个...
Java资源缓存中的LruCache是一个非常实用的内存缓存机制,特别适用于Android应用程序,尤其是对于频繁加载和显示图片的应用。LruCache是Android Support Library v4中的一个类,它基于LinkedHashMap实现,遵循“最近...
1. 创建一个继承自LruCache的子类,重写`sizeOf()`方法来确定每个键值对的大小。 2. 初始化LruCache实例,传入总内存大小,通常为应用可用内存的1/4。 3. 使用`put()`方法将Bitmap添加到缓存,`get()`方法获取已缓存...
在文档中,ThumbnailCache类继承自LruCache,并且重写了sizeOf方法来计算Bitmap对象的内存占用大小,从而保证了缓存的大小控制在合理的范围,防止内存溢出。 文档还提到了如何确定LruCache的大小。通过使用...
我们可以通过重写 sizeOf 方法计算每个缓存对象的内存占用。LruCache 是一个泛型类,可以容纳各种对象,因此它无法计算被储存对象的大小。 LruCache 实际上是对 LinkedHashMap 进行了封装并处理了线程安全问题。...
该项目中,开发者首先定义了一个继承自LruCache的自定义类,如`BitmapLruCache`,并重写了`sizeOf()`方法来计算每个Bitmap对象占用的内存大小。然后,在`put()`方法中将图片加载到缓存,而在`get()`方法中尝试从缓存...
LRUCache(Least Recently Used Cache,最近最少使用缓存)是Android系统提供的一个基于LRU算法的内存缓存机制,常用于数据缓存,优化应用性能。在Android开发中,当我们需要频繁读取某些数据,但又不希望每次都从...
2. **重写sizeOf()方法**: `LruCache`通过`sizeOf()`方法来计算每个条目的大小。对于图片,我们可以计算其位图的像素数量,并将其转换为字节数。 ```java @Override protected int sizeOf(String key, Bitmap ...
在Android开发过程中,为了防止因加载大量图片而导致应用程序出现内存溢出(OutOfMemoryError),通常会采用LRUCache(Least Recently Used Cache)来管理图片缓存。这种方式能够有效地减少内存消耗,提高应用性能。...