探秘google开源android项目gallery如何在手机内存有限的情况下缓存手机sdcard的图片或者视频
来源:互联网 发布:网络经营项目 编辑:程序博客网 时间:2024/05/17 04:17
在开始阅读这篇博文前,需要一点点java基础的储备知识
1.ReferenceQueue的作用,我上一篇博文有比较深入的讲解。
2.简单了解LRU算法,我在这里推荐两篇快速了解并学习LRU算法的博文链接:
http://blog.csdn.net/Ackarlix/archive/2007/08/26/1759793.aspx
http://liangwj72.iteye.com/blog/123856
直接上代码
package cn.itcast.camera.gallery;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* LruCache(对象缓冲池)用于缓存对象,有些图片或者视频在界面上显示,如果每次都从数据库去取(图片或视频文件以二进制流的形式存在数据库中),
* 就会加应用处理的负担
* ,用LruCache就能解决此问题,只要第一次从数据库中取出,然后把取出的东西放在LRUCache中,之后每次就可以从LRUCache中去取了
* ,加快访问速度。并有效地节省内存。
*/
public class LruCache<K, V> {
//mLruMap:一个简单实现LRU算法的LinkedHashMap
private final HashMap<K, V> mLruMap;
//mWeakMap:保存 弱引用对象Entry
private final HashMap<K, Entry<K, V>> mWeakMap = new HashMap<K, Entry<K, V>>();
//mQueue:记录引用对象已被垃圾回收器回收过的Entry
private ReferenceQueue<V> mQueue = new ReferenceQueue<V>();
//设定LruCache固定存储的最大容量
@SuppressWarnings("serial")
public LruCache(final int capacity) {
mLruMap = new LinkedHashMap<K, V>(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//LRU算法最关键的一步,自动清除过期数据,始终保证mLruMap 的size<=capacity,即mLruMap 内存占用总大小<=单个对象所占内存*capacity
return size() > capacity;
}
};
}
private static class Entry<K, V> extends WeakReference<V> {
//保存Key值,以便mWeakMap删除已被垃圾回收器回收过的弱引用对象Entry
K mKey;
public Entry(K key, V value, ReferenceQueue<V> queue) {
super(value, queue);
mKey = key;
}
}
//清空mWeakMap里已被垃圾回收器回收过的Entry(表明Entry所引用的对象已经被垃圾回收器回收,这时需要清除Entry对象本身)
@SuppressWarnings("unchecked")
private void cleanUpWeakMap() {
Entry<K, V> entry = (Entry<K, V>) mQueue.poll();
//一旦垃圾回收器回收该Entry所引用的对象,就从mWeakMap里删除该Entry
while (entry != null) {
mWeakMap.remove(entry.mKey);
entry = (Entry<K, V>) mQueue.poll();
}
}
//将对象放入缓存,并保存弱引用
public synchronized V put(K key, V value) {
cleanUpWeakMap();
mLruMap.put(key, value);
Entry<K, V> entry = mWeakMap.put(key, new Entry<K, V>(key, value, mQueue));
return entry == null ? null : entry.get();
}
//取得对象
public synchronized V get(K key) {
cleanUpWeakMap();
V value = mLruMap.get(key);
if (value != null)
return value;
Entry<K, V> entry = mWeakMap.get(key);
return entry == null ? null : entry.get();
}
//清空
public synchronized void clear() {
mLruMap.clear();
mWeakMap.clear();
mQueue = new ReferenceQueue<V>();
}
}
- 探秘google开源android项目gallery如何在手机内存有限的情况下缓存手机sdcard的图片或者视频
- android 手机内存和sdcard内存 的获取
- 如何在不安装OPENCV MANAGER情况下进行android手机跑OPENCV+ANDROID的程序
- android 手机内存 和 sdcard的 大小的获取
- android 手机内存 和 sdcard的 大小的获取
- /mnt/sdcard或者/sdcard这是Android手机中SD卡的文件夹路径
- android开发,APP下载成功的图片或者视频同时显示在手机自带的相册里
- android 删除SD卡或者手机的缓存图片和目录
- 如何在有限的内存的情况下,找到大量数据中重复查询次数最多的语句
- 关于手机目录下的sdcard解析
- Android手机SdCard上的文件操作
- 获取android 手机的sdcard 信息
- 手机内存二合一的情况下,关机闹钟无法播放手机内存铃声的问题
- 内存有限的情况下 Spark 如何处理 T 级别的数据?
- 内存有限的情况下 Spark 如何处理 T 级别的数据
- 关于android中项目导入显示乱码或者运行在手机显示乱码问题的解决
- 谈谈在人力资源有限的情况下,项目经理怎么解决项目测试工作的质量。
- 手机内存 和 sdcard的 大小的获取
- 一些flash memory/SSD的基础知识
- tomcat 中文路径
- columnCheckTree1.1
- 学习记录
- EBMIDE——序
- 探秘google开源android项目gallery如何在手机内存有限的情况下缓存手机sdcard的图片或者视频
- Vim 的一些小技巧
- jquery 查找
- jquery validate
- PowerShell与cmd的对比点评(一)——文件定位和操作
- SVM系列
- db2 delete 大表不写日志方法
- 大数相乘-C语言实现
- SWL