问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

universalimageloader中缓存何时释放,占用内存多算泄漏吗

发布网友 发布时间:2022-05-01 17:21

我来回答

1个回答

热心网友 时间:2022-06-20 05:30

① UI:请求数据,使用唯一的Key值索引Memory Cache中的Bitmap。
② 内存缓存:缓存搜索,如果能找到Key值对应的Bitmap,则返回数据。否则执行第三步。
③ 硬盘存储:使用唯一Key值对应的文件名,检索SDCard上的文件。
④ 如果有对应文件,使用BitmapFactory.decode*方法,解码Bitmap并返回数据,同时将数据写入缓存。如果没有对应文件,执行第五步。
⑤ 下载图片:启动异步线程,从数据源下载数据(Web)。
⑥ 若下载成功,将数据同时写入硬盘和缓存,并将Bitmap显示在UI中。
接下来,我们回顾一下UIL中缓存的配置(具体的见《UNIVERSAL IMAGE LOADER.PART 2》)。重点关注注释部分,我们可以根据自己需要配置内存、磁盘缓存的实现。

File cacheDir = StorageUtils.getCacheDirectory(context,
"UniversalImageLoader/Cache");

ImageLoaderConfiguration config = new
ImageLoaderConfiguration .Builder(getApplicationContext())
.maxImageWidthForMemoryCache(800)
.maxImageHeightForMemoryCache(480)
.httpConnectTimeout(5000)
.httpReadTimeout(20000)
.threadPoolSize(5)
.threadPriority(Thread.MIN_PRIORITY + 3)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedCache(2000000)) // 你可以传入自己的内存缓存
.discCache(new UnlimitedDiscCache(cacheDir)) // 你可以传入自己的磁盘缓存
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.build();

UIL中的内存缓存策略
1. 只使用的是强引用缓存
LruMemoryCache(这个类就是这个开源框架默认的内存缓存类,缓存的是bitmap的强引用,下面我会从源码上面分析这个类)
2.使用强引用和弱引用相结合的缓存有
UsingFreqLimitedMemoryCache(如果缓存的图片总量超过限定值,先删除使用频率最小的bitmap)
LRULimitedMemoryCache(这个也是使用的lru算法,和LruMemoryCache不同的是,他缓存的是bitmap的弱引用)
FIFOLimitedMemoryCache(先进先出的缓存策略,当超过设定值,先删除最先加入缓存的bitmap)
LargestLimitedMemoryCache(当超过缓存限定值,先删除最大的bitmap对象)
LimitedAgeMemoryCache(当 bitmap加入缓存中的时间超过我们设定的值,将其删除)
3.只使用弱引用缓存
WeakMemoryCache(这个类缓存bitmap的总大小没有*,唯一不足的地方就是不稳定,缓存的图片容易被回收掉)

我们直接选择UIL中的默认配置缓存策略进行分析。
ImageLoaderConfiguration config = ImageLoaderConfiguration.createDefault(context);

ImageLoaderConfiguration.createDefault(…)这个方法最后是调用Builder.build()方法创建默认的配置参数的。默认的内存缓存实现是LruMemoryCache,磁盘缓存是UnlimitedDiscCache。
LruMemoryCache解析
LruMemoryCache:一种使用强引用来保存有数量*的Bitmap的cache(在空间有限的情况,保留最近使用过的Bitmap)。每次Bitmap被访问时,它就被移动到一个队列的头部。当Bitmap被添加到一个空间已满的cache时,在队列末尾的Bitmap会被挤出去并变成适合被GC回收的状态。
注意:这个cache只使用强引用来保存Bitmap。
LruMemoryCache实现MemoryCache,而MemoryCache继承自MemoryCacheAware。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么一些男性喜欢要求伴侣叫自己爸爸? proteus8中怎么放置引脚标号 ...在proteus里不知道用什么表示?有没有什么proteus中专门的中英文对照... 甜蜜家园郑毅铭是什么身份 甜蜜家园第二季郑毅铭喜欢谁 瑞梦喜智能空调床垫适合人群 小孩可以用智能床垫吗 智能床垫适合哪些人用 我父亲今年59岁,有高血压和颈椎病的病史,最近一段时间感觉一躺下就偏... ...刚从医院治疗回来。我想买个枕头给他,不知买怎样的比较好?_百度知 ... 有什么正规的外汇平台吗 内存泄露,加服务器缓存有什么用 MFC 双缓冲内存泄露 电视自动升级后己缴费的银河奇异果就找不到了 如何规避客户端浏览器缓存风险 android有哪些具体的情形会导致内存泄漏 什么是C/C++中的缓存溢出等安全漏洞。 小米盒子搜不到奇异果 utorrent 内存泄露怎么办?在高速下载的时候会发生缓存泄露。。以前不会,最近突然会写泄露,我重装系统都 内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法? 电池热管理系统的上市公司那么多,安森美半导体在其中排名怎么样? 安森美半导体的领导层 安森美半导体(深圳)有限公司怎么样? 萨科微slkor适用逆变器的MOS管相比英飞凌、安森美、仙童的有什么优势? 2020年教师资格笔试时间分别是什么时候? ios怎么连接 外面买的冰糖草莓怎样保存 冰糖草莓可以保存多久 开关跳闸的原因 开关跳闸 是因为电阻过大还是小? 网易云音乐创建电台审核通过了为什么不显示在别人手机里面? 为什么内存溢出 DNF 是不是存在内存泄漏问题啊,如何解决,我玩游戏都是内存慢慢上升到1.3G占用然后系统卡的不行. 不要泡打粉和黄油的蛋糕的做法大全微波炉 用微波炉蛋糕,只有普通面粉,不要泡打粉 怎么不用泡打粉,用微波炉也能做出松软的蛋糕? 怎样才能做不加泡打粉的微波炉蛋糕 微波炉做蛋糕怎么做啊?我家没泡打粉,有安琪酵母粉! 微波炉蛋糕的做法不用泡打粉. 怎么用微波炉制作蛋糕?要简单点! 在家里用微波炉如何制作蛋糕?需要发酵粉吗? 没有泡打粉和黄油,如何用微波炉做蛋糕? 销售部销售经理翻译成英文怎么写? 销售经理的英文怎么翻译 销售经理的英文 我是销售部经理用英语怎么说(介词用in 营销经理 用英语翻译一下 求助新生活0.8瑞秋事件后去摩根家怎么不让 我是销售部经理 用英语怎么说(介词用in 还是 of) 谢谢 "营销总经理"翻译成英文 中国区销售经理 英文