博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)Android技术积累:图片缓存管理
阅读量:7144 次
发布时间:2019-06-28

本文共 1773 字,大约阅读时间需要 5 分钟。

如果每次加载同一张图片都要从网络获取,那代价实在太大了。所以同一张图片只要从网络获取一次就够了,然后在本地缓存起来,之后加载同一张图片时就从缓存中加载就可以了。从内存缓存读取图片是最快的,但是因为内存容量有限,所以最好再加上文件缓存。文件缓存空间也不是无限大的,容量越大读取效率越低,因此可以设置一个限定大小比如10M,或者限定保存时间比如一天。

因此,加载图片的流程应该是:

  1. 先从内存缓存中获取,取到则返回,取不到则进行下一步;

  2. 从文件缓存中获取,取到则返回并更新到内存缓存,取不到则进行下一步;

  3. 从网络下载图片,并更新到内存缓存和文件缓存。

接下来看内存缓存类:ImageMemoryCache

public class ImageMemoryCache {    /** * 从内存读取数据速度是最快的,为了更大限度使用内存,这里使用了两层缓存。 * 硬引用缓存不会轻易被回收,用来保存常用数据,不常用的转入软引用缓存。 */ private static final int SOFT_CACHE_SIZE = 15; //软引用缓存容量 private static LruCache
mLruCache; //硬引用缓存 private static LinkedHashMap
> mSoftCache; //软引用缓存 public ImageMemoryCache(Context context) { int memClass = ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); int cacheSize = 1024 * 1024 * memClass / 4; //硬引用缓存容量,为系统可用内存的1/4 mLruCache = new LruCache
(cacheSize) { @Override protected int sizeOf(String key, Bitmap value) { if (value != null) return value.getRowBytes() * value.getHeight(); else return 0; } @Override protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) { if (oldValue != null) // 硬引用缓存容量满的时候,会根据LRU算法把最近没有被使用的图片转入此软引用缓存 mSoftCache.put(key, new SoftReference
(oldValue)); } }; mSoftCache = new LinkedHashMap
>(SOFT_CACHE_SIZE, 0.75f, true) { private static final long serialVersionUID = 6040103833179403725L; @Override protected boolean removeEldestEntry(Entry
> eldest) { if (size() > SOFT_CACHE_SIZE){ return true; } return false; } }; } /** * 从缓存中获取图片 */ public Bitmap getBitmapFromCache(String url) { Bitmap bitmap; //先从硬引用缓存中获取 synchronized (mLruCache) { bitmap = mLruCache.get(url); if

转载于:https://www.cnblogs.com/gao-chun/p/4810488.html

你可能感兴趣的文章
使用Parallel.Invoke并行你的代码
查看>>
有状态服务还是无状态服务?
查看>>
python --- 异常处理
查看>>
Linux-Rsync命令参数详解
查看>>
java--xml文件读取(JDOM&DOM4J)
查看>>
Iterator<Entry<String,String>> iter=map.entrySet().iterator(); 是什么意思
查看>>
CUDA笔记(11)
查看>>
Fancybox丰富的弹出层效果
查看>>
口袋笔记VS松鼠笔记
查看>>
silverlight 将chart图倒入到excel
查看>>
IE 下JS和CSS 阻塞后面内容总结
查看>>
Oracle数据库常用操作脚本
查看>>
LeetCode – Refresh – Word Search
查看>>
清理messages提示-bash: /var/log/messages: Operation not permitted的处理
查看>>
flask蓝图的简单使用
查看>>
数据科学家公司生存指南TOP30秘诀
查看>>
ADO.NET笔记——使用Connection连接数据库,使用Command对象的ExecuteReader()方法创建DataReader对象返回多行数据...
查看>>
go第三方日志系统-seelog-使用文档
查看>>
数据库回滚(rollback)和撤销(undo)的区别
查看>>
蚂蚁微信-商家入驻后支付失败
查看>>