分类: Android平台
2014-05-23 11:58:39
一、简介
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。特点:
1. 多线程的图像加载;
2. 图片异步加载缓存机制,包括内存缓存(软引用)及本地缓存;
3. 动态对ImageLoader的配置(线程池的大小,HTTP选项,内存和光盘高速缓存方式,显示图像,以及其他选项);
4. 对加载过程实现监听和事件处理;
5. 能够配置加载图片的显示选项,包括图片圆角处理和加载完成显示动画等。
每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。
流程图:
加载图片之前,先要做初始化配置。先实例化一个全局的ImageLoader对象,同时传入图片加载缓存的配置。然后调用ImageLoader的displayImage方法,就可以把图片显示出来了。
官方下载:。项目结构如下图:
1. cache主要是磁盘缓存及内存缓存预定的接口和常规实现类,包含的算法较多,如FIFO算法、LRU算法等。
2. core是整个ImageLoader的核心包,图片下载、适配显示,并向上层应用提供各种接口,默认模板,还包括很多关键枚举类、工具类。
3. utils是常规工具类,如ImageSizeUtils、StorageUtils等。
二、使用
将.jar导入到新建的项目中,参考sample中的例子进行使用即可。
1. 先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况。可以选择在Application中全局初始化设置该类。如:
1. ImageLoaderConfiguration config = new ImageLoaderConfiguration
2. .Builder(context)
3. .memoryCacheExtraOptions(480, 800) // max width, max height
4. .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader, use it carefully (Better don't use it)
5. .threadPoolSize(3)//线程池内加载的数量
6. .threadPriority(Thread.NORM_PRIORITY - 2)
7. .denyCacheImageMultipleSizesInMemory()
8. .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation
9. .memoryCacheSize(2 * 1024 * 1024)
10. .discCacheSize(50 * 1024 * 1024)
11. .discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
12. .tasksProcessingOrder(QueueProcessingType.LIFO)
13. .discCacheFileCount(100) //缓存的文件数量
14. .discCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径
15. .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
16. .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
17. .writeDebugLogs() // Remove for release app
18. .build();//开始构建
19. // Initialize ImageLoader with configuration.
AndroidManifest.xml中的配置
1.
2.
3. …
4. android:name=".MyApplication"
2. 使用ImageLoader进行图片加载的时候,先要实例化ImageLoader,ImageLoader imageLoader = ImageLoader.getInstance(); 在每个布局里面都要实例化后再使用。根据需要进行显示的图片的各种格式DisplayImageOptions 的设置:
1. DisplayImageOptions options;
2. options = new DisplayImageOptions.Builder()
3. .showImageOnLoading(R.drawable.ic_launcher) //设置图片在下载期间显示的图片
4. .showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
5. .showImageOnFail(R.drawable.ic_launcher) //设置图片加载/解码过程中错误时候显示的图片
6. .cacheInMemory(true)//设置下载的图片是否缓存在内存中
7. .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
8. .considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
9. .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
10. .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//
11. .decodingOptions(android.graphics.BitmapFactory.Options decodingOptions)//设置图片的解码配置
12. //.delayBeforeLoading(int delayInMillis)//int delayInMillis为你设置的下载前的延迟时间
13. //设置图片加入缓存前,对bitmap进行设置
14. //.preProcessor(BitmapProcessor preProcessor)
15. .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
16. .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
17. .displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间
18. .build();//构建完成
3. 按需求调用
a) 加载默认配置的一个图片ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件
b) 加载自定义配置的一个图片ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件
c) 图片加载时带加载情况的监听
1. imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {
2. @Override
3. public void onLoadingStarted() {
4. //开始加载的时候执行
5. }
6. @Override
7. public void onLoadingFailed(FailReason failReason) {
8. //加载失败的时候执行
9. }
10. @Override
11. public void onLoadingComplete(Bitmap loadedImage) {
12. //加载成功的时候执行
13. }
14. @Override
15. public void onLoadingCancelled() {
16. //加载取消的时候执行
17.
18. }});
d) 图片加载时候,带监听又带加载进度条的情况
1. imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {
2. @Override
3. public void onLoadingStarted() {
4. //开始加载的时候执行
5. }
6. @Override
7. public void onLoadingFailed(FailReason failReason) {
8. //加载失败的时候执行
9. }
10. @Override
11. public void onLoadingComplete(Bitmap loadedImage) {
12. //加载成功的时候执行
13. }
14. @Override
15. public void onLoadingCancelled() {
16. //加载取消的时候执行
17. },new ImageLoadingProgressListener() {
18. @Override
19. public void onProgressUpdate(String imageUri, View view, int current,int total) {
20. //在这里更新 ProgressBar的进度信息
21. }
22. });
4. 如果经常出现OOM:
a. 减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
b. 使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
c. 使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);
d. 避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
e. 使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory()。
参考资料:
http://blog.csdn.net/vipzjyno1/article/details/23206387