Chinaunix首页 | 论坛 | 博客
  • 博客访问: 405329
  • 博文数量: 78
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 940
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-25 09:39
文章分类

全部博文(78)

文章存档

2016年(7)

2015年(1)

2014年(35)

2013年(35)

我的朋友

分类: Android平台

2014-05-23 11:58:39

一、简介

Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。特点:

1.         多线程的图像加载;

2.         图片异步加载缓存机制,包括内存缓存(软引用)及本地缓存;

3.         动态对ImageLoader的配置(线程池的大小,HTTP选项,内存和光盘高速缓存方式,显示图像,以及其他选项);

4.         对加载过程实现监听和事件处理;

5.         能够配置加载图片的显示选项,包括图片圆角处理和加载完成显示动画等。

每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。

流程图:


加载图片之前,先要做初始化配置。先实例化一个全局的ImageLoader对象,同时传入图片加载缓存的配置。然后调用ImageLoaderdisplayImage方法,就可以把图片显示出来了。

官方下载:。项目结构如下图:

1.      cache主要是磁盘缓存及内存缓存预定的接口和常规实现类,包含的算法较多,如FIFO算法、LRU算法等。

2.      core是整个ImageLoader的核心包,图片下载、适配显示,并向上层应用提供各种接口,默认模板,还包括很多关键枚举类、工具类。

3.      utils是常规工具类,如ImageSizeUtilsStorageUtils等。

二、使用

.jar导入到新建的项目中,参考sample中的例子进行使用即可。

1.      先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况。可以选择在Application全局初始化设置该类。如:

1.  ImageLoaderConfiguration config = new ImageLoaderConfiguration  

2.      .Builder(context)  

3.      .memoryCacheExtraOptions(480800// max width, max height

4.      .discCacheExtraOptions(480800, CompressFormat.JPEG, 75null// 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 * 100030 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间  

17.     .writeDebugLogs() // Remove for release app  

18.     .build();//开始构建  

19.     // Initialize ImageLoader with configuration.  

AndroidManifest.xml中的配置

1.   "android.permission.INTERNET" />  

2.   "android.permission.WRITE_EXTERNAL_STORAGE" />

3.  

4.   android:name=".MyApplication"

2.      使用ImageLoader进行图片加载的时候,先要实例化ImageLoaderImageLoader 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, imageViewoptions); // 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

http://smallwoniu.blog.51cto.com/3911954/1336194

阅读(2608) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~