8.4.1 ImageLoader
ImageLoader 的工作原理(已经不维护了)
在显示图片的时候,它会先在内存中查找;如果没有,就去本地查找;如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。
基于这个原理,我们可以在每次退出一个页面的时候,把ImageLoader 内存中的缓存全都清除,这样就节省了大量内存,反正下次再用到的时候从本地再取出来就是了。此外,由于ImageLoader 对图片是软引用的形式,所以内存中的图片会在内存不足的时候被系统回收(内存足够的时候不会对其进行垃圾回收)。
ImageLoader 由三大组件组成:
- ImageLoaderConf iguration——对图片缓存进行总体配置,包括内存缓存的大小、本地缓存的大小和位置、日志、下载策略(FIFO 还是LIFO)等等。
- ImageLoader——是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),但是其实最终他们的实现都是displayImage(...)。
- DisplayImageOptions——在每个页面需要显示图片的地方,控制如何显示的细节,比如指定下载时的默认图(包括下载中、下载失败、URL 为空等),是否将缓存放到内存或者本地磁盘。
借用一个比喻,“他们有点像厨房规定、厨师、客户个人口味之间的关系。ImageLoaderConf iguration 就像是厨房里面的规定,每一个厨师要怎么着装,要怎么保持厨房的干净,这是针对每一个厨师都适用的规定,而且不允许个性化改变。ImageLoader 就像是具体做菜的厨师,负责具体菜谱的制作。DisplayImageOptions 就像每个客户的偏好,根据客户是重口味还是清淡,每一个ImageLoader 根据DisplayImageOptions的要求具体执行。”
ImageLoader 优化
尽管ImageLoader 很强大,但一直把图片缓存在内存中,会导致内存占用过高。虽然对图片的引用是软引用,软引用在内存不够的时候会被GC,但我们还是希望减少GC 的次数,所以要经常手动清理ImageLoader 中的缓存。
我们在AppBaseActivity 中的onDestroy 方法中,执行ImageLoader 的clearMemoryCache方法,以确保页面销毁时,把为了显示这个页面而增加的内存缓存清除。这样,即使到了下个页面要复用之前加载过的图片,虽然内存中没有了,根据ImageLoader 的缓存策略,还是可以在本地磁盘上找到。
ImageLoader 优点
1. 多线程下载图片:
图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
2. 支持随意的配置:
例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
3. 支持图片的内存缓存,文件系统缓存或者SD卡缓存
4. 支持图片下载过程的监听
5. 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
6. 较好的控制图片的加载过程
例如滚动中暂停图片加载(PauseOnScrollListener),重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
7. 提供在较慢的网络下对图片进行加载
8. 默认实现多种内存缓存算法
这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。
9. 支持本地缓存文件名规则定义
8.4.1 ImageLoader的更多相关文章
- android使用ImageLoader实现图片缓存(安卓开发必备)
相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListVie ...
- android ImageLoader 混淆加载drawable出现黑色图片的解决方案
在网上找了很久,没有找到.后来看了源码才知道... 多线程异步加载和显示图片(图片来源于网络.sd卡.assets文件夹,drawable文件夹(不能加载9patch),新增加载视频缩略图) Stri ...
- ImageLoader配合ImageSwitcher的使用
先在MyApplication中初始化ImageLoader initImageLoader(getApplicationContext()); /** * 初始化ImageLoader * 如果你经 ...
- ImageLoader
配置ImageLoader 一般我们在使用ImageLoader的时候,需要在应用程序的入口进行它的一个配置,这个配置一般写到Application里边 * public void initImage ...
- ImageLoader加载图片
先导universal-image-loader-1.9.3包 在application配置 android:name=".MyApplication" intent权限 1 pa ...
- ImageLoader图片加载
http://blog.csdn.net/liu1164316159/article/details/38728259 转载请注明http://write.blog.csdn.net/po ...
- Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide
一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...
- ImageLoader框架的使用、调用系统相册显示图片并裁剪显示、保存图片的两种方式
ImageLoader虽然说是一个相对于比较老的一个框架了 ,但是总的来说,还是比较好用的,今天我就总结了一下它的用法.还有调用系统相册并裁剪,以及,通过sharedpreference和文件存储来保 ...
- jsLoader、cssLoader、imageLoader
//js文件加载 function jsLoader(url,callback){ var script = document.createElement("script"); s ...
随机推荐
- const用法小结
const与指针 char *const p --> char *(const p) --> 指针常量 char const *p --> char (const *p) --> ...
- Libcurl多线程crash问题(cento)
cento :http://blog.csdn.net/delphiwcdj/article/details/18284429 1 问题背景 后台系统有一个单线程的http接口,为了提高并发处理能力, ...
- android之handle
Android中异步消息处理主要由四个部分组成,Message.handler.messageQueue和looper. 1.message message是线程之间传递的消息,他可以在内部携带少量的 ...
- redis cluster java client jedisCluster spring集成方法
1.使用jedis的原生JedisCluster spring的applicationContext.xml配置redis的连接.连接池.jedisCluster Bean <bean id=& ...
- Div+CSS命名规范
注意事项:1.命名遵循驼峰式 2.尽量用中文 3.不加中杠和下划线 4.尽量不缩写,除非一看就明白的单词 头:header 标志:logo 友情链接:friendlink 内容:c ...
- Amoeba+Mysql实现数据库读写分离
一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离 ...
- Daily Scrum 12.18
对于老师课上所问为什么燃尽图(图如下)的完成小时数增加的问题,我们的理解是完成小时数是完成迭代2所需要的总共时间,当加入任务的时候,也就是蓝色部分增长的时候,完成小时数就会增加. 今日大家都在做编译实 ...
- iOStextFiled判断输入长度
个人在开发当中发现在用textField的代理方法 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(N ...
- JS 传值 传址
在JS中,有两种不同的方式可以操作数据的值,这两种技术分别叫做 传值 和 传址. 传值:在赋值过程中,首先对值进行了一份拷贝,而后将这份拷贝存储到一个变量.对象属性或数组元素中.拷贝的值和原始的值是完 ...
- 自己实现atoi的功能
整理思路: #include <stdio.h> int len(const char *s) { ; while (s[len]) { len++; } return len; } in ...