级缓存实现对图片的加载
来源:互联网 发布:椭圆拟合算法 编辑:程序博客网 时间:2024/06/05 21:41
一、概述:
现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多。
现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响。当然,我想,向百度美拍这样的应用,必然也有其内部的图片缓存策略。总之,图片缓存是很重要而且是必须的。
二、实现原理:
实现图片缓存也不难,需要有相应的cache策略。这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且也把它划到缓存的层次结构中。当根据url向网络拉取图片的时候,先从内存中找,如果内存中没有,再从缓存文件中查找,如果缓存文件中也没有,再从网络上通过http请求拉取图片。在键值对(key-value)中,这个图片缓存的key是图片url的hash值,value就是bitmap。所以,按照这个逻辑,只要一个url被下载过,其图片就被缓存起来了。
但这里不使用SoftReference,而使用LruCache进行图片的缓存
为什么使用LruCache:
这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。
在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。
三、具体实现:
1)在构造方法里初始化LruCache mCache
if (mCache == null) {
// 最大使用的内存空间
int maxSize = (int) (Runtime.getRuntime().freeMemory() / 4);
mCache = new LruCache
- 级缓存实现对图片的加载
- Android 使用三级缓存实现对图片的加载
- Android 使用三级缓存实现对图片的加载
- Android 使用三级缓存实现对图片的加载 .
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- 实现三级缓存加载图片
- 对图片的缓存
- NSURLProtocol实现对WKWebView加载的网页的数据缓存
- Glide加载图片并实现图片缓存
- Android图片异步加载与本地缓存的实现
- NukeSwift实现的图片加载、缓存、处理等库
- 网络图片加载,实现了简单的三级缓存
- universal-image-loader实现图片的异步加载与缓存
- android studio怎么修改创建的Activity的模板?
- 奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True
- 远程调用Exchange的power shell进行管理
- 11.08笔记整理及心得
- css选择器
- 级缓存实现对图片的加载
- 在PHP中怎么接收post过来的JSON数据(可以是接口推送过来的数据)
- PC机使用网络调试助手获取onenet的数据
- 各种分辨率显示屏参数对照
- SVN常用命令
- 算法导论思考题15.2(最长回文子序列)
- 使用MyEclipse新建maven项目时报An internal error occurred during: "Retrieving archetypes:". GC overhead limit
- 复盘王者荣耀手游开发全过程,Unity引擎使用帧同步放弃状态同步
- 线性筛法求素数