android缓存之Lrucache 和LinkedHashMap
两者的区别
网上有很多人使用软引用加载图片的多 ,但是现在已经不再推荐使用这种方式了,
(1)因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,
这让软引用和弱引用变得不再可靠。
(2)另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,
因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃,
所以我这里用得是LruCache来缓存图片,当存储Image的大小大于LruCache设定的值,系统自动释放内存,
这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。
先学习下LinkedHashMap
public LinkedHashMap (int initialCapacity, float loadFactor, boolean accessOrder);
initialCapacity 初始容量
loadFactor 加载因子,一般是 0.75f
accessOrder false 基于插入顺序 true 基于访问顺序(get一个元素后,这个元素被加到最后,使用了LRU 最近最少被使用的调度算法)
boolean accessOrder = true;
Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder);
m.put("1", "test1");
m.put("2", "test2");
m.put("3", "test3");
System.out.println(m); //{1=test1, 2=test2, 3=test3}
Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder);
m.put("1", "test1");
m.put("2", "test2");
m.put("3", "test3");
m.get("1");
m.get("2");
System.out.println(m); //{3=test3, 1=test1, 2=test2}
boolean accessOrder = false;
Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder);
m.put("1", "test1");
m.put("2", "test2");
m.put("3", "test3");
System.out.println(m); //{1=test1, 2=test2, 3=test3}
boolean accessOrder = false;
Map<String, String> m = new LinkedHashMap<String, String>(20, .80f,accessOrder);
m.put("1", "test1");
m.put("2", "test2");
m.put("3", "test3");
m.get("1");
m.get("2");
System.out.println(m); //{1=test1, 2=test2, 3=test3}
public class MemoryCache {
private final static int MAP_CACHE_SIZE = ;
private LruCache<String, Bitmap> lruCache = null;
private LinkedHashMap<String, SoftReference<Bitmap>> merCache = null;
private static MemoryCache mc = null;
private MemoryCache() {
merCache = new LinkedHashMap<String, SoftReference<Bitmap>>(
MAP_CACHE_SIZE, 0.75f, true) {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(
Entry<String, SoftReference<Bitmap>> eldest) {
if (eldest != null) {
return true;
}
return false;
}
};
int lruCacheSize = (int) (Runtime.getRuntime().maxMemory() / );
lruCache = new LruCache<String, Bitmap>(lruCacheSize) {
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
if (oldValue != null) {
merCache.put(key, new SoftReference<Bitmap>(oldValue));
}
}
@Override
protected int sizeOf(String key, Bitmap value) {
return (int) (value.getRowBytes() * value.getHeight());
}
};
}
//单例模式
public static MemoryCache getInstance() {
if (mc == null) {
mc = new MemoryCache();
}
return mc;
}
//放入一个bitmap
public synchronized void putBitmap(String url, Bitmap bitmap) {
if (bitmap != null) {
lruCache.put(url, bitmap);
}
}
//获取bitmap
public synchronized Bitmap getBitmap(String url) {
if (TextUtils.isEmpty(url)) {
return null;
}
Bitmap bitmap = lruCache.get(url);
if (bitmap != null) {
lruCache.remove(url);
lruCache.put(url, bitmap);
return bitmap;
}
SoftReference<Bitmap> sr = merCache.get(url);
if (sr != null) {
bitmap = sr.get();
if (bitmap != null) {
merCache.remove(url);
lruCache.put(url, bitmap);
return bitmap;
} else {
sr = null;
merCache.remove(url);
}
}
return bitmap;
}
//清空HashMap
public void clear() {
merCache.clear();
}
//删除一个bitmap
public void delete(String url) {
lruCache.remove(url);
merCache.remove(url);
}
}
android缓存之Lrucache 和LinkedHashMap的更多相关文章
- 【转】彻底解析Android缓存机制——LruCache
彻底解析Android缓存机制——LruCache 关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存.这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻 ...
- Android缓存机制——LruCache
概述 LruCache的核心原理就是对LinkedHashMap的有效利用,它的内部存在一个LinkedHashMap成员变量,值得注意的4个方法:构造方法.get.put.trimToSize LR ...
- 安卓开发笔记——关于照片墙的实现(完美缓存策略LruCache+DiskLruCache)
这几天一直研究在安卓开发中图片应该如何处理,在网上翻了好多资料,这里做点小总结,如果朋友们有更好的解决方案,可以留言一起交流下. 内存缓存技术 在我们开发程序中要在界面上加载一张图片是件非常容易的事情 ...
- Android缓存处理
Android缓存: 採用缓存,能够进一步大大缓解数据交互的压力,又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不须要实时更新.哪怕是3-5分 ...
- android缓存具体解释
Android缓存: 採用缓存,能够进一步大大缓解数据交互的压力.又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不须要实时更新,哪怕是3-5分 ...
- Android中的LruCache的原理和使用
Android中的LruCache的原理和使用 LruCache,虽然很多文章都把LRU翻译成"最近最少使用"缓存策略,但Android中的LruCache真的如此吗? 答案是No ...
- Android 缓存
1.Android缓存机制&一个缓存框架推荐 http://blog.csdn.net/shakespeare001/article/details/51695358 2.ASimpleCac ...
- Android缓存学习入门(二)
本文主要包括以下内容 内存缓存策略 文件缓存策略 内存缓存策略 当有一个图片要去从网络下载的时候,我们并不会直接去从网络下载,因为在这个时代,用户的流量是宝贵的,耗流量的应用是不会得到用户的青睐的.那 ...
- android 缓存Bitmap - 开发文档翻译
由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Loading a single bitmap into your user interf ...
随机推荐
- vb6 控件未注册问题解决
打开项目时弹出如题错误. 另附一个帖子:http://bbs.csdn.net/topics/390580540,这个帖子讨论的不错,可以提供很多思路. 解决办法:http://rewwensoftw ...
- Photoshop基础,前景背景,图层,选取
1*前景色背景色 Alt+Delete 键 前景色填充 Ctrl+Delete 键 背景色填充 X 颜色转换 D 颜色互换 两个填充的原因: 2*图层(只要做东西就要建图层)透明的纸进行叠加,尽量多建 ...
- Hidden Word
Hidden Word time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- 简单hash[或者是哈希思想]
题目链接 /* 有一个长度为n的只包含小写字母的字符串s,有m次操作,每次输入2个字符 A , B表示将s中的全部字符A变成B,B变成A. char sky[30],顺序记录每个字母的映射,在sky[ ...
- GameUnity 2.0 文档(一) 事件机制
新版本和旧版本一样,有socket事件和内部事件.区别在于,你只要一个监听就可以 消息协议规则: 用类名标记协议的好处是什么? 是利用反射机制来处理每个消息. 程序启动的时候,会读取所有类名,并字典保 ...
- python 对比图片相似度
最近appium的使用越来越广泛了,对于测试本身而言,断言同样是很重要的,没有准确的断言那么就根本就不能称之为完整的测试了.那么目前先从最简单的截图对比来看.我这里分享下python的图片相似度的代码 ...
- lucene索引合并与增量索引
利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率.当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中.为了解决这个问题, Lucene ...
- lucene-SpanNotQuery和SpanOrQuery交迭与全局跨度
1.在匹配结果中排除相互交迭的跨度 SpanNotQuery构造函数的第一个参数表示要包含的跨度对象,第二个参数表示要排除的跨度对象. 1) SpanNearQuery quick_fox=new S ...
- JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能
主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...
- IIS Express允许外部访问(外部调试)
Visual Studio配合IIS Express为Web开发提供了强劲的调试功能,本文介绍IIS Express如何在调试模式下让局域网的其他设备进行访问,以便进行测试. 1.打开IIS Expr ...