ImageLoader的使用

转载 2016年05月30日 18:51:16

使用配置:

1 导入工程jar包:

https://github.com/nostra13/Android-Universal-Image-Loader,找到universal-image-loader-1.9.5.jar

2 写入权限:
  1. <!-- Include following permission if you load images from Internet -->  
  2.     <uses-permission android:name="android.permission.INTERNET" />  
  3.     <!-- Include following permission if you want to cache images on SD card -->  
  4.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
3 可导入ImageLoaderUtils进行相关参数配置 :http://download.csdn.net/detail/xiaoleiacm/9535639


ImageLoader相关:


1 初始化ImageLoaderConfiguration

初始化ImageLoaderConfiguration包括内存缓存设置,SD卡缓存设置,以及下载线程相关设置,进行初始化时需要获取屏幕宽高,以及分配给该应用程序的内存大小(总APP内存的八分一)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.     * 初始化ImageLoaderConfiguration 
  3.     */  
  4.    private void InitImageLoaderConfiguration() {  
  5.   
  6.   
  7.        /**************** 获得屏幕宽高 start **************************/  
  8.        DisplayMetrics displayMetrics = new DisplayMetrics();  
  9.        mContext.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);  
  10.        int widthPixels = displayMetrics.widthPixels;  
  11.        int heightPixels = displayMetrics.heightPixels;  
  12. /        System.out.println("widthPixels :" + widthPixels + " heightPixels :" + heightPixels);  
  13.        /***************  获得屏幕宽高 end ****************************/  
  14.   
  15.        /***************  获取内存缓存的1/8 开始 ************************/  
  16.        int maxMemory = (int) Runtime.getRuntime().maxMemory();  
  17.        int cacheSize = maxMemory / 8;  
  18.        /**************  获取内存缓存的1/8 结束 ************************/  
  19.   
  20.   
  21.        /************设置SD卡缓存储存路径 File Dir 开始 ***********************************/  
  22.        File cacheDirectory = StorageUtils.getOwnCacheDirectory(mContext, "imageloader/Cache");  
  23.        System.out.println(cacheDirectory); //storage/emulated/legacy/imageloader/Cache  
  24.        /************设置SD卡缓存储存路径 File Dir 结束 ***********************************/  
  25.   
  26.   
  27.        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)  
  28.   
  29.   
  30.                /****************************** 内存缓存设置 ****************************/  
  31.                .memoryCacheExtraOptions(widthPixels, heightPixels) // 屏幕宽高  
  32.                .memoryCache(new UsingFreqLimitedMemoryCache(cacheSize)) // 可选择不同的内存缓存方式UsingFreqLimitedMemoryCache  
  33.                .memoryCacheSize(cacheSize)  
  34.                .denyCacheImageMultipleSizesInMemory() // 拒绝在缓存中缓存多个URL相同的图片  
  35.                        /****************************** 内存缓存设置 ****************************/  
  36.   
  37.   
  38.                        /******************************   SD卡缓存设置 ****************************/  
  39.                .diskCacheExtraOptions(widthPixels, heightPixels, new BitmapProcessor() {  
  40.                    @Override  
  41.                    public Bitmap process(Bitmap bitmap) {  
  42.                        System.out.println("Bitmap :" + bitmap);  
  43.                        return null;  
  44.                    }  
  45.                }) //储存到SD卡时,对Bitmap进行相应处理,  
  46.                .diskCache(new UnlimitedDiskCache(cacheDirectory)) //无限制大小缓存 ,同时设置缓存储存路径  
  47.                .diskCacheSize(50 * 1024 * 1024)// 缓存大小  
  48.                .diskCacheFileCount(100//缓存文件数量  
  49.                .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //对于缓存的图片名进行MD5加密  
  50.                        /******************************   SD卡缓存设置 ****************************/  
  51.   
  52.   
  53.                        /******************************  线程 开始 ****************************/  
  54.                .threadPoolSize(3)  
  55.                .threadPoolSize(Thread.NORM_PRIORITY - 2)  
  56.                .tasksProcessingOrder(QueueProcessingType.LIFO)  
  57.                 /*不需要外部调用,是线程池相关,在ImageLoaderEngine中调用 
  58.                .taskExecutor() 
  59.                .taskExecutorForCachedImages() 
  60.                */  
  61.                .defaultDisplayImageOptions(options) // 设置默认图片显示选项 下面的option对象DisplayImageOptions.createSimple()  
  62.                .imageDownloader(new BaseImageDownloader(mContext, 5 * 100030 * 1000))// connectTimeout (5 s), readTimeout (30 s)超时时间  
  63.   
  64.                        /******************************  线程 结束 ****************************/  
  65.   
  66.   
  67.                .build();  
  68.        ImageLoader.getInstance().init(config);  
  69.    }  


在设置diskCache时 有以下内存缓存可选项:


1. 只使用的是强援用缓存 

  • LruMemoryCache(这个类就是这个开源框架默许的内存缓存类,缓存的是bitmap的强援用)

2.使用强援用和弱援用相结合的缓存有

  • UsingFreqLimitedMemoryCache(如果缓存的图片总量超过限定值,先删除使用频率最小的bitmap)
  • LRULimitedMemoryCache(这个也是使用的lru算法,和LruMemoryCache不同的是,他缓存的是bitmap的弱援用)
  • FIFOLimitedMemoryCache(先进先出的缓存策略,当超过设定值,先删除最早加入缓存的bitmap)
  • LargestLimitedMemoryCache(当超过缓存限定值,先删除最大的bitmap对象)
  • LimitedAgeMemoryCache(当 bitmap加入缓存中的时间超过我们设定的值,将其删除)

3.只使用弱援用缓存

WeakMemoryCache(这个类缓存bitmap的总大小没有限制,唯1不足的地方就是不稳定,缓存的图片容易被回收掉)

2  DisplayImageOptions是进行图片显示的参数,总的包括 图片适配设置,以及显示方式设置

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.  private DisplayImageOptions InitDisplayImageOptions() {  
  2.   
  3.   
  4.         options = new DisplayImageOptions.Builder()  
  5.                 .showImageOnLoading(R.mipmap.ic_launcher)  //设置在下载期间的图片  
  6.                 .showImageForEmptyUri(R.mipmap.ic_launcher) //  
  7.                 .showImageOnFail(R.mipmap.ic_launcher)  
  8.                 .cacheInMemory(true)  
  9.                 .cacheOnDisk(true)  
  10.   
  11.   
  12.                         /************ 图片适配设置 开始************************/  
  13.                         //UIL为了避免将原图放到内存,会根据ImageView的参数来缩小图片的尺寸,这些参数包括  
  14.                         //maxWidth 、maxHeight 、layout_width 、layout_height,另外图片是等比压缩的,为了让图片填满整个view,可以设置ImageView的android:scaleType="fitXY",不过这样如果等比压缩后的图片小于容器的宽和高,会被拉伸变形。  
  15.                 .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)  
  16.                 .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
  17.                 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//  
  18.                         /************ 图片适配设置 结束************************/  
  19.   
  20.                         /********************* 显示方式 开始****************************/  
  21.                 .displayer(new CircleBitmapDisplayer(Color.WHITE, 5))  
  22. //                    .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
  23.                 .displayer(new FadeInBitmapDisplayer(5000))  
  24.                 .displayer(new RoundedBitmapDisplayer(1005))//是否设置为圆角,弧度为多少  
  25.                         /********************* 显示方式 结束****************************/  
  26.   
  27.   
  28.                 .build();  
  29.   
  30.   
  31.         return options;  
  32.   
  33.     }  

note:返回的option传给了ImageLoaderConfiguration 的defaultDisplayImageOptions(options)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 以上配置中的:  
  2.   
  3.  1).imageScaleType(ImageScaleType imageScaleType)  是设置 图片的缩放方式  
  4.      缩放类型mageScaleType:  
  5.   
  6.               EXACTLY :图像将完全按比例缩小的目标大小  
  7.   
  8.               EXACTLY_STRETCHED:图片会缩放到目标大小完全  
  9.   
  10.               IN_SAMPLE_INT:图像将被二次采样的整数倍  
  11.   
  12.               IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小  
  13.   
  14.               NONE:图片不会调整  
  15.   2).displayer(BitmapDisplayer displayer)   是设置 图片的显示方式  
  16.   
  17.       显示方式displayer:  
  18.   
  19.               RoundedBitmapDisplayer(int roundPixels)设置圆角图片  
  20.   
  21.               FakeBitmapDisplayer()这个类什么都没做  
  22.   
  23.               FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间  
  24.   
  25.          SimpleBitmapDisplayer()正常显示一张图片    
  26.   
  27.    
  28.   
  29. 之后按照需求调用  


3 图片的加载:


1 单独加载1张图片时:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件  


2  使用相应配置文件加载时:(常用)
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件  
  2.       


3 加载图片需要监听时:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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.         }});    



以下是完整的配置Utils,可作为接口调用:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.admin.myapplication;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.Color;  
  7. import android.util.DisplayMetrics;  
  8.   
  9. import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;  
  10. import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;  
  11. import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;  
  12. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  13. import com.nostra13.universalimageloader.core.ImageLoader;  
  14. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  15. import com.nostra13.universalimageloader.core.assist.ImageScaleType;  
  16. import com.nostra13.universalimageloader.core.assist.QueueProcessingType;  
  17. import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;  
  18. import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;  
  19. import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;  
  20. import com.nostra13.universalimageloader.core.download.BaseImageDownloader;  
  21. import com.nostra13.universalimageloader.core.process.BitmapProcessor;  
  22. import com.nostra13.universalimageloader.utils.StorageUtils;  
  23.   
  24. import java.io.File;  
  25.   
  26. /** 
  27.  * Created by admin on 2016/5/30. 
  28.  * note:使用步骤 1:初始化ImageLodaerUtils 
  29.  * 2 调用InitImageLoder 
  30.  * 3 在进行加载时,调用getOption获得DisplayImageOptions参数 
  31.  */  
  32. public class ImageLoaderUtils {  
  33.     private Activity mContext;  
  34.   
  35.     public DisplayImageOptions options; // options选项  
  36.   
  37.     public ImageLoaderUtils(Activity mContext) {  
  38.         this.mContext = mContext;  
  39.     }  
  40.   
  41.     /** 
  42.      * 获取Option设置参数 
  43.      * 
  44.      * @return 
  45.      */  
  46.     public DisplayImageOptions getOption() {  
  47.         return options;  
  48.     }  
  49.   
  50.     /** 
  51.      * 初始化ImageLodaer 
  52.      */  
  53.     public void InitImageLoder() {  
  54.         InitDisplayImageOptions();  
  55.         InitImageLoaderConfiguration();  
  56.     }  
  57.   
  58.     /** 
  59.      * 初始化DisplayImageOptions 
  60.      * 
  61.      * @return 
  62.      */  
  63.     private DisplayImageOptions InitDisplayImageOptions() {  
  64.   
  65.   
  66.         options = new DisplayImageOptions.Builder()  
  67.                 .showImageOnLoading(R.mipmap.ic_launcher)  //设置在下载期间的图片  
  68.                 .showImageForEmptyUri(R.mipmap.ic_launcher) //  
  69.                 .showImageOnFail(R.mipmap.ic_launcher)  
  70.                 .cacheInMemory(true)  
  71.                 .cacheOnDisk(true)  
  72.   
  73.   
  74.                         /************ 图片适配设置 开始************************/  
  75.                         //UIL为了避免将原图放到内存,会根据ImageView的参数来缩小图片的尺寸,这些参数包括  
  76.                         //maxWidth 、maxHeight 、layout_width 、layout_height,另外图片是等比压缩的,为了让图片填满整个view,可以设置ImageView的android:scaleType="fitXY",不过这样如果等比压缩后的图片小于容器的宽和高,会被拉伸变形。  
  77.                 .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)  
  78.                 .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
  79.                 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//  
  80.                         /************ 图片适配设置 结束************************/  
  81.   
  82.                         /********************* 显示方式 开始****************************/  
  83.                 .displayer(new CircleBitmapDisplayer(Color.WHITE, 5))  
  84. //                    .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位  
  85.                 .displayer(new FadeInBitmapDisplayer(5000))  
  86.                 .displayer(new RoundedBitmapDisplayer(1005))//是否设置为圆角,弧度为多少  
  87.                         /********************* 显示方式 结束****************************/  
  88.   
  89.   
  90.                 .build();  
  91.   
  92.   
  93.         return options;  
  94.   
  95.     }  
  96.   
  97.     /** 
  98.      * 初始化ImageLoaderConfiguration 
  99.      */  
  100.     private void InitImageLoaderConfiguration() {  
  101.   
  102.   
  103.         /**************** 获得屏幕宽高 start **************************/  
  104.         DisplayMetrics displayMetrics = new DisplayMetrics();  
  105.         mContext.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);  
  106.         int widthPixels = displayMetrics.widthPixels;  
  107.         int heightPixels = displayMetrics.heightPixels;  
  108. //        System.out.println("widthPixels :" + widthPixels + " heightPixels :" + heightPixels);  
  109.         /***************  获得屏幕宽高 end ****************************/  
  110.   
  111.         /***************  获取内存缓存的1/8 开始 ************************/  
  112.         int maxMemory = (int) Runtime.getRuntime().maxMemory();  
  113.         int cacheSize = maxMemory / 8;  
  114.         /**************  获取内存缓存的1/8 结束 ************************/  
  115.   
  116.   
  117.         /************设置SD卡缓存储存路径 File Dir 开始 ***********************************/  
  118.         File cacheDirectory = StorageUtils.getOwnCacheDirectory(mContext, "imageloader/Cache");  
  119.         System.out.println(cacheDirectory); //storage/emulated/legacy/imageloader/Cache  
  120.         /************设置SD卡缓存储存路径 File Dir 结束 ***********************************/  
  121.   
  122.   
  123.         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)  
  124.   
  125.   
  126.                 /****************************** 内存缓存设置 ****************************/  
  127.                 .memoryCacheExtraOptions(widthPixels, heightPixels) // 屏幕宽高  
  128.                 .memoryCache(new UsingFreqLimitedMemoryCache(cacheSize)) // 可选择不同的内存缓存方式UsingFreqLimitedMemoryCache  
  129.                 .memoryCacheSize(cacheSize)  
  130.                 .denyCacheImageMultipleSizesInMemory() // 拒绝在缓存中缓存多个URL相同的图片  
  131.                         /****************************** 内存缓存设置 ****************************/  
  132.   
  133.   
  134.                         /******************************   SD卡缓存设置 ****************************/  
  135.                 .diskCacheExtraOptions(widthPixels, heightPixels, new BitmapProcessor() {  
  136.                     @Override  
  137.                     public Bitmap process(Bitmap bitmap) {  
  138.                         System.out.println("Bitmap :" + bitmap);  
  139.                         return null;  
  140.                     }  
  141.                 }) //储存到SD卡时,对Bitmap进行相应处理,  
  142.                 .diskCache(new UnlimitedDiskCache(cacheDirectory)) //无限制大小缓存 ,同时设置缓存储存路径  
  143.                 .diskCacheSize(50 * 1024 * 1024)// 缓存大小  
  144.                 .diskCacheFileCount(100//缓存文件数量  
  145.                 .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //对于缓存的图片名进行MD5加密  
  146.                         /******************************   SD卡缓存设置 ****************************/  
  147.   
  148.   
  149.                         /******************************  线程 开始 ****************************/  
  150.                 .threadPoolSize(3)  
  151.                 .threadPoolSize(Thread.NORM_PRIORITY - 2)  
  152.                 .tasksProcessingOrder(QueueProcessingType.LIFO)  
  153.                  /*不需要外部调用,是线程池相关,在ImageLoaderEngine中调用 
  154.                 .taskExecutor() 
  155.                 .taskExecutorForCachedImages() 
  156.                 */  
  157.                 .defaultDisplayImageOptions(options) // 设置默认图片显示选项 下面的option对象DisplayImageOptions.createSimple()  
  158.                 .imageDownloader(new BaseImageDownloader(mContext, 5 * 100030 * 1000))// connectTimeout (5 s), readTimeout (30 s)超时时间  
  159.   
  160.                         /******************************  线程 结束 ****************************/  
  161.   
  162.   
  163.                 .build();  
  164.         ImageLoader.getInstance().init(config);  
  165.     }  
  166. }  

在调用时使用:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. imageLoaderUtils = new ImageLoaderUtils(MainActivity.this);  
  2.            imageLoaderUtils.InitImageLoder();  
  3.            ImageLoader.getInstance().displayImage(Constants.IMAGES[position], viewHolder.image, imageLoaderUtils.getOption());  


Note:

1 UIL会根据layout_height ,layout_width,maxWidth,maxHeight来适配相应图片的大小

How UIL define Bitmap size needed for exact ImageView? It searches defined parameters:

  • Get actual measured width and height of ImageView
  • Get android:layout_width and android:layout_height parameters
  • Get android:maxWidth and/or android:maxHeight parameters
  • Get maximum width and/or height parameters from configuration (memoryCacheExtraOptions(int, int) option)
  • Get width and/or height of device screen

So try to set android:layout_width|android:layout_height orandroid:maxWidth|android:maxHeight parameters for ImageView if you know approximate maximum size of it. It will help correctly compute Bitmap size needed for this view and save memory.

2 OOM问题

 If you often got OutOfMemoryError in your app using Universal Image Loader then:

  • Disable caching in memory. If OOM is still occurs then it seems your app has a memory leak. Use MemoryAnalyzer to detect it. Otherwise try the following steps (all of them or several):
  • Reduce thread pool size in configuration (.threadPoolSize(...)). 1 - 5 is recommended.
  • Use .bitmapConfig(Bitmap.Config.RGB_565) in display options. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888.
  • Use .imageScaleType(ImageScaleType.EXACTLY)
  • Use .diskCacheExtraOptions(480, 320, null) in configuration

3 URL example

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. "http://site.com/image.png" // from Web  
  2. "file:///mnt/sdcard/image.png" // from SD card  
  3. "file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)  
  4. "content://media/external/images/media/13" // from content provider  
  5. "content://media/external/video/media/13" // from content provider (video thumbnail)  
  6. "assets://image.png" // from assets  
  7. "drawable://" + R.drawable.img // from drawables (non-9patch images)  

相关文章推荐

开源框架Volley的使用《二》[NetWorkImageView&&LruCache&ImageLoader]

上一篇对Volley做了一个初步的介绍,除了ImaggeRequest稍微有点绕之外,其它的功能跟xuils基本大同小异。再强调ImaggeRequest中的宽高参数maxWidth,maxHeigh...

ImageLoader的使用

ImageLoader可以实现: 1)可以实现多线程下载图片,图片可以来源于网络,文件和assets,drawable本地等。 2)可以随意的配置ImageLoader。例如线程池,图片下载器,内存缓...

ImageLoader的使用

  • 2015-10-13 09:37
  • 4.51MB
  • 下载

Imageloader四种图片显示(圆形,淡入,圆角,修饰)使用

这一长篇我们来看这四种图片显示在代码中如何使用,以开源组件中的例子为准。 先看一组圆形和淡入动画的效果  这个淡入为了能看清效果我的时间改成了10s; 圆角的效果图:   1....

imageloader使用

  • 2016-04-05 19:59
  • 620KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)