今天在做项目的时候用了之前写的图片加载类,虽然也能实现缓存什么的,但是在加载大图的时候很慢很慢,于是上网找解决方案,准备优化一下,无意中发现了 Android-Universal-Image-Loader,用过的人都说好,一开始我是拒绝的,但是耐不住网友的评论,于是尝试用了一下,结果我duang了,真的好好吃啊,哦,不,是好好用啊。下面就讲解一下使用过程吧。

其实有位网友已经写的很详细了,我也是参考他的:http://blog.csdn.net/vipzjyno1/article/details/23206387,有需要的可以直接看他的,我这里只是简单记录下学习记录罢了。

首先是GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader

一、既然是通过网络获取图片,并涉及缓存,那么肯定需要两个权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

二、配置ImageLoaderConfiguration这个类,可以在Application中初始化设置该类。

ImageLoaderConfiguration config = new ImageLoaderConfiguration  .Builder(context)  .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽  .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader, use it carefully (Better don't use it)/设置缓存的详细信息,最好不要设置这个  .threadPoolSize(3)//线程池内加载的数量  .threadPriority(Thread.NORM_PRIORITY - 2)  .denyCacheImageMultipleSizesInMemory()  .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现  .memoryCacheSize(2 * 1024 * 1024)    .discCacheSize(50 * 1024 * 1024)    .discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密  .tasksProcessingOrder(QueueProcessingType.LIFO)  .discCacheFileCount(100) //缓存的文件数量  .discCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径  .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间  .writeDebugLogs() // Remove for release app  .build();//开始构建  // Initialize ImageLoader with configuration.  

以上配置按需选择,无需全部配置

记得在你的Manifest中为你的application写上name属性

<applicationandroid:name="com.cwenhui.chowhound.config.UILApplication"android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@android:style/Theme.Light.NoTitleBar" >
......
</application>

配置好ImageLoaderConfiguration后,调用以下方法来实现初始化:

[java]  view plain copy
  1. ImageLoader.getInstance().init(config);//全局初始化此配置

注1:ImageLoaderConfiguration 配置中的.discCacheFileNameGenerator()方法是将缓存下来的文件以什么方式命名

里面可以调用的方法有  1.new Md5FileNameGenerator() //使用MD5对UIL进行加密命名

2.new HashCodeFileNameGenerator()//使用HASHCODE对UIL进行加密命名

注2:关于 设置缓存的目录,可以通过以下方法:

[java]  view plain copy
  1. File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "imageloader/Cache");

//这个是你希望的缓存文件的目录:imageloader/Cache

之后在ImageLoaderConfiguration的配置文件中通过设置

[java]  view plain copy
  1. .discCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径

方法来设置该应用的图片缓存路径。

三、使用ImageLoader进行图片加载的时候,先要实例化ImageLoader,调用以下方法进行实例化,在每个布局里面都要实例化后再使用。

[java]  view plain copy
  1. protected ImageLoader imageLoader = ImageLoader.getInstance();

之后进行显示的图片的各种格式DisplayImageOptions 的设置:

[java]  view plain copy
  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();//构建完成

同样是根据需求选择性地配置

注:

以上配置中的:

1).imageScaleType(ImageScaleType imageScaleType)  是设置 图片的缩放方式
     缩放类型mageScaleType:

EXACTLY :图像将完全按比例缩小的目标大小

EXACTLY_STRETCHED:图片会缩放到目标大小完全

IN_SAMPLE_INT:图像将被二次采样的整数倍

IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小

NONE:图片不会调整
  2).displayer(BitmapDisplayer displayer)   是设置 图片的显示方式

显示方式displayer:

RoundedBitmapDisplayer(int roundPixels)设置圆角图片

FakeBitmapDisplayer()这个类什么都没做

FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间

         SimpleBitmapDisplayer()正常显示一张图片  

之后按照需求调用

1.纯粹为了加载默认配置的一个图片的

方法:

public void displayImage(String uri, ImageView imageView) {}

具体实现:

[java]  view plain copy
  1. ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件

2.加载自定义配置的一个图片的

方法:

public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) {}

具体实现:

[java]  view plain copy
  1. ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件

3.图片加载时候带加载情况的监听

方法:

public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageLoadingListener listener) {}

ImageLoadingListener 用于监听图片的下载情况。

具体实现:

[java]  view plain copy
  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. }});

4.图片加载时候,带监听又带加载进度条的情况
   调用:
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
                    ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {}
   具体实现:

[java]  view plain copy
  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. });

四、注意事项
  1.上述提到的2个权限必须加入,否则会出错
  2.ImageLoaderConfiguration必须配置并且全局化的初始化这个配置ImageLoader.getInstance().init(config);  否则也会出现错误提示
  3.ImageLoader是根据ImageView的height,width确定图片的宽高。
  4.如果经常出现OOM(别人那边看到的,觉得很有提的必要)
   ①减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
   ②使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
   ③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者        try.imageScaleType(ImageScaleType.EXACTLY);
   ④避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
   ⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();

对于如何加载本地图片:

  1. String imageUri = "http://site.com/image.png"; // from Web
  2. String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
  3. String imageUri = "content://media/external/audio/albumart/13"; // from content provider
  4. String imageUri = "assets://image.png"; // from assets
  5. String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)

参考:http://blog.csdn.net/vipzjyno1/article/details/23206387

图片异步加载之 Android-Universal-Image-Loader相关推荐

  1. android复位机器人图片_Universal-Image-Loader 图片异步加载类库还不熟?

    码个蛋(codeegg) 第 824 次推文 作者:欢醉 博客:https://cloud.tencent.com/developer/article/1026386 码妞看世界 写在前面 这个图片异 ...

  2. Android 图片异步加载的体会,SoftReference已经不再适用

    在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>>  这样软引用的方式 ...

  3. android webview 图片异步加载,Webview 图片异步加载及bug解决

    在项目中新闻显示需要使用图片的异步加载,并且在加载图片前和加载图片失败时显示默认图片. 关于webview中图片的异步加载的思路如下: 方案一:由前端同学全权负责(使用js实现异步加载) 方案二:an ...

  4. Android 图片异步加载

    所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...

  5. ListView中的图片异步加载、缓存

    一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不好 ...

  6. ImageLoader 图片异步加载类库的使用

    http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用, ...

  7. Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    UIL( Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)) http://blog.csdn.net/vipzjyno1/article/detai ...

  8. 基于jQuery的图片异步加载和预加载实例

    如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...

  9. android图片异步加载图片,Android 异步加载图片分析总结

    研究了android从网络上异步加载图像,现总结如下: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new ...

  10. java加载图片到缓存_Android实现图片异步加载并缓存到本地

    在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下 ...

最新文章

  1. 开关电源三种控制模式:PWM/PFM/PSM
  2. 从上到下打印二叉树1
  3. [SQL]死锁处理语句
  4. 最好的电脑系统_安装电脑系统不求人,教你如何自己动手装系统!值得收藏学习...
  5. 什么是Lucene和Solr和Elasticsearch,它们的区别是什么?
  6. Oracle10g数据库的完全卸载:
  7. LeetCode 837. 新21点(动态规划)
  8. vue 使用 better-scroll
  9. Productivity Power Tools 动画演示(转)
  10. binarytreenode”使用 类 模板 需要 模板 参数列表_0基础掌握Django框架(7)Django模板介绍...
  11. 我开发的kvm虚拟化虚拟机批量生产脚本
  12. 【Java程序设计】运算符与优先级
  13. Magick 使用注意
  14. css 小尖角,css如何实现气泡的小尖角效果 css实现气泡的小尖角效果代码示例
  15. java调用存储过程 sql server,Sql Server的存储过程与Java代码相连接调用(二)
  16. 笔记本 安装服务器系统,笔记本电脑安装Windows Server 2016之我见
  17. 计算机最基础知识复制文件,电脑基础入门知识-复制粘贴文件图文教程
  18. Docker Image 基础使用命令
  19. Arena | 用Excel设计的RPG游戏
  20. HTML5七夕情人节表白网页制作【绘制冬季下雪3D相册】HTML+CSS+JavaScript html生日快乐祝福网页制作

热门文章

  1. Android记事本 (附apk和源码)
  2. excel字符串和单元格拼接_excel字符合并技巧:几种连接字符串的方法助你高效办公...
  3. 汇编x86x64游戏内存封包实战注入脚本lua辅助开发反调试过检测
  4. webmagic ajax,webmagic爬虫对静态页面,动态页面及js请求方式爬取的处理
  5. Django框架学习【mysql】
  6. 出名要趁早?赚到第一个100万更要趁早!
  7. 初学 ASP.NET AJAX (三):使用 UpdatePanel
  8. 十进制数的编码与运算
  9. 半部论语治天下,一段Scratch懂论语
  10. 【渗透】Redis 未授权访问漏洞利用(三种利用方式)