UIL Github 网址

系类文章:(universal Image Loader)UIL使用(2),UIL使用3

universal image loader 的功能就是加载图片

在as 中 app 模块下的 build.gradle 文件中加上 依赖  (不了解Gradle的可以看看这个基本的Gradle介绍) Android Studio 之Gradle 学习

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

当然也可以下载jar 包 放在libs 目录下

然后再android  manifest 文件下加入下面的权限

<manifest><!-- Include following permission if you load images from Internet  联网权限--><uses-permission android:name="android.permission.INTERNET" /><!-- Include following permission if you want to cache images on SD card 写sd 权限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />...
</manifest>

在第一次使用UIL加载图片之前必须先在Application /Activity中创建一个全局的配置和用这个配置初始化ImageLoader

例如像下面这样

public class MyApplication extends Application {private static ImageLoader mImageLoader;

    @Override
    public void onCreate() {super.onCreate();
        /**
         * 全局配置 ,这里简单的使用createDefault() 创建一个默认的imageLoaderConfiguration
         * 等同于  ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this).build();
         *
         */
        ImageLoaderConfiguration imageLoaderConfiguration = ImageLoaderConfiguration.createDefault(this);

        //初始化ImageLoader
        ImageLoader.getInstance().init(imageLoaderConfiguration);

        mImageLoader = ImageLoader.getInstance();
    }public static ImageLoader getImageLoader() {return mImageLoader;
    }
}

MainActivity 中

public class MainActivity extends AppCompatActivity {private final String url = "http://tupian.enterdesk.net/2015/0815/20150815044936402.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView = (ImageView) this.findViewById(R.id.imageView);
        //获得在Application中配置初始化的Imageloader
        ImageLoader imageLoader = MyApplication.getImageLoader();
        //加载并显示图片在imageView中
        imageLoader.displayImage(url,imageView);
    }
}

运行效果

上面是最最简单的使用方法,easy

假如我在没有创建一个全局的配置和init ImageLoader 会有什么事情发生尼?

  ImageLoaderConfiguration imageLoaderConfiguration = ImageLoaderConfiguration.createDefault(this);
//
//        //初始化ImageLoader
//        ImageLoader.getInstance().init(imageLoaderConfiguration);
        mImageLoader = ImageLoader.getInstance();

就是把上面的两行注释掉

追踪displayImage   (ImageLoader.java)

会throws 一个非法状态的异常说在displayImage 方法条用之前这个init方法没有被调用

这个异常就是在checkConfiguration方法中throws  的

/**
 * Checks if ImageLoader's configuration was initialized
 *
 * @throws IllegalStateException if configuration wasn't initialized
 */
private void checkConfiguration() {if (configuration == null) {    throw new IllegalStateException(ERROR_NOT_INIT);
   }
}

这个configuration的赋值就是在 init方法中赋值的

public synchronized void init(ImageLoaderConfiguration configuration) {if (configuration == null) {throw new IllegalArgumentException(ERROR_INIT_CONFIG_WITH_NULL);
   }if (this.configuration == null) {L.d(LOG_INIT_CONFIG);
      engine = new ImageLoaderEngine(configuration);
      this.configuration = configuration;
   } else {L.w(WARNING_RE_INIT_CONFIG);
   }
}

那么这个ImageLoaderConfiguration 类到底有什么作用对于加载图片的时候

看到这个class倒是不怎么大

里面有一个Builder 类

里面有一些变量

     public static final int DEFAULT_THREAD_POOL_SIZE = 3;//线程池的大小/** {@value} */public static final int DEFAULT_THREAD_PRIORITY = Thread.NORM_PRIORITY - 2;线程优先级 = 正常优先级-2/** {@value} */public static final QueueProcessingType DEFAULT_TASK_PROCESSING_TYPE = QueueProcessingType.FIFO; //线程的处理:先进先出private Context context;private int maxImageWidthForMemoryCache = 0;//在内存缓存中图片的最大宽度private int maxImageHeightForMemoryCache = 0;//在内存缓存中图片的最大高度private int maxImageWidthForDiskCache = 0;//在disk缓存中图片的最大宽度private int maxImageHeightForDiskCache = 0;//在disk缓存中图片的最大高度度private BitmapProcessor processorForDiskCache = null;//图片处理器,用于对从disk缓存中的取出来的图片进行处理private Executor taskExecutor = null; //用于执行从源获取图片任务的 Executorprivate Executor taskExecutorForCachedImages = null;//用于执行从cache获取图片任务的 Executorprivate boolean customExecutor = false;//用户是否自定义了taskExecutorprivate boolean customExecutorForCachedImages = false;//用户是否自定义了taskExecutorForCachedImagesprivate int threadPoolSize = DEFAULT_THREAD_POOL_SIZE;//线程池的大小private int threadPriority = DEFAULT_THREAD_PRIORITY;//线程优先级private boolean denyCacheImageMultipleSizesInMemory = false;//不允许缓存中有多张不同尺寸的图片private QueueProcessingType tasksProcessingType = DEFAULT_TASK_PROCESSING_TYPE;//处理线程队列的方式FIFO ,LIFOprivate int memoryCacheSize = 0; //内存缓存的大小private long diskCacheSize = 0;//磁盘缓存的大小private int diskCacheFileCount = 0;//磁盘缓存的文件数private MemoryCache memoryCache = null;//内存缓存的对象private DiskCache diskCache = null;//磁盘缓存 对象 ,一般sd卡private FileNameGenerator diskCacheFileNameGenerator = null;//diskCache文件名生成的方法,如diskCacheFileNameGenerator 采用MD5加密private ImageDownloader downloader = null;//图片下载器private ImageDecoder decoder;//图片解释器private DisplayImageOptions defaultDisplayImageOptions = null;//图片显示的相关配置,加载前,加载后,加载失败private boolean writeLogs = false;  //是否打开调试日志,记录UIL的详细Log

这个Builder 类里面的变量基本是包含了ImageLoaderConfiguration 类里面的变量

ImageLoaderConfiguration的构造方法
private ImageLoaderConfiguration(final Builder builder) {resources = builder.context.getResources();maxImageWidthForMemoryCache = builder.maxImageWidthForMemoryCache;maxImageHeightForMemoryCache = builder.maxImageHeightForMemoryCache;maxImageWidthForDiskCache = builder.maxImageWidthForDiskCache;maxImageHeightForDiskCache = builder.maxImageHeightForDiskCache;processorForDiskCache = builder.processorForDiskCache;taskExecutor = builder.taskExecutor;taskExecutorForCachedImages = builder.taskExecutorForCachedImages;threadPoolSize = builder.threadPoolSize;threadPriority = builder.threadPriority;tasksProcessingType = builder.tasksProcessingType;diskCache = builder.diskCache;memoryCache = builder.memoryCache;defaultDisplayImageOptions = builder.defaultDisplayImageOptions;downloader = builder.downloader;decoder = builder.decoder;customExecutor = builder.customExecutor;customExecutorForCachedImages = builder.customExecutorForCachedImages;networkDeniedDownloader = new NetworkDeniedImageDownloader(downloader);slowNetworkDownloader = new SlowNetworkImageDownloader(downloader);L.writeDebugLogs(builder.writeLogs);}

所以我们也可以自己配置全局配置

例如下面这样

File cacheDir = StorageUtils.getCacheDirectory(this);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).memoryCacheExtraOptions(480, 800) // default = device screen dimensions
        .diskCacheExtraOptions(480, 800, null).taskExecutor(null).taskExecutorForCachedImages(null).threadPoolSize(3) // default
        .threadPriority(Thread.NORM_PRIORITY - 2) // default
        .tasksProcessingOrder(QueueProcessingType.FIFO) // default
        .denyCacheImageMultipleSizesInMemory().memoryCache(new LruMemoryCache(2 * 1024 * 1024)).memoryCacheSize(2 * 1024 * 1024).memoryCacheSizePercentage(13) // default
        .diskCache(new UnlimitedDiskCache(cacheDir)) // default
        .diskCacheSize(50 * 1024 * 1024).diskCacheFileCount(100).diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
        .imageDownloader(new BaseImageDownloader(this)) // default
        .imageDecoder(new BaseImageDecoder(true)) // default
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
        .writeDebugLogs().build();

那么我们使用的默认的configuration 的值是什么(createDefault方法)下面是ImageLoader.java里面的一段注释

Creates default configuration for {@link ImageLoader} <br />
  <b>Default values:</b>
  <ul>
  <li>maxImageWidthForMemoryCache = device's screen width设备屏幕的宽度</li>
  <li>maxImageHeightForMemoryCache = device's screen height设备屏幕的高度</li>
  <li>maxImageWidthForDikcCache = unlimited没有限制</li>
  <li>maxImageHeightForDiskCache = unlimited没有限制</li>
  <li>threadPoolSize =   public static final int DEFAULT_THREAD_POOL_SIZE = 3;</li>
  <li>threadPriority =  public static final int DEFAULT_THREAD_PRIORITY = Thread.NORM_PRIORITY - 2;</li>
  <li>allow to cache different sizes of image in memory 允许同一张图片不同尺寸在内存的缓存中存在</li>
  <li>memoryCache =  默认是LruMemoryCache</li>
  <li>diskCache = 默认是UnlimitedDiskCache</li>
  <li>imageDownloader =  默认BaseImageDownloader</li>
  <li>imageDecoder =默认BaseImageDecoder(loggingEnabled);</li>
  <li>diskCacheFileNameGenerator =  默认是HashCodeFileNameGenerator</li>
  <li>defaultDisplayImageOptions = Simple options}</li>
  <li>tasksProcessingOrder =  线程队列处理顺序 (还有LIFO)</li>
  <li>detailed logging disabled 不打开调试日志</li>
  </ul>

下面再看看getInstance()方法做了些什么

/** Returns singleton class instance
*得到ImageLoader的单例。通过双层是否为 null 判断提高性能。
*/public static ImageLoader getInstance() {if (instance == null) {synchronized (ImageLoader.class) {if (instance == null) {instance = new ImageLoader();}}}return instance;}protected ImageLoader() {}

未完代写.....

(universal Image Loader)UIL 使用 (1)相关推荐

  1. (universal Image Loader)UIL 使用 (2)

    系列(universal Image Loader)UIL 使用 (1)   UIL 使用 3 简单介绍了UIL的最基本的使用方法,这次继续老学习UIL的使用 这次只是分析学习一个方法 <spa ...

  2. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  3. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  4. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法 参考文章: (1)universal image loader在listview/ ...

  5. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解

    在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个 ...

  6. 全网最全Android开发工具,Android开发框架大全

    涵盖Android方方面面的技术, 目前保持更新. 时刻与Android开发流行前沿同步. 目录 一.工具 Android开发工具 在线工具宝典大全 二.框架 *缓存框架* DiskLruCache ...

  7. 【Android 进阶】Android优秀框架

    根据上图我们依次说明: 1,DiskLruCache 硬盘缓存最佳方案(Google提供的一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)) DiskLruC ...

  8. 图片加载框架之UIL

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  9. 从UIL库谈Android图片加载中需要注意的事情

    Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...

最新文章

  1. 掌握Tiles框架 (二)-- Tiles布局和定义
  2. 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
  3. 使用函数PIVOT现实数据行转列
  4. CentOS 6.0安装JDK7
  5. hack 入侵 142 主机的过程
  6. javax.net.ssl.SSLException MESSAGE: closing inbound before receiving peer‘s close_notify
  7. Python弹窗提示警告框MessageBox
  8. 矩阵运算和一些基本的几何运算
  9. HDR与ToneMapping
  10. java之xml编程
  11. java关闭服务_实现优雅地关闭Docker中的java服务
  12. LNMP 常见问题(FAQ)
  13. 网络风险成为中国企业新挑战
  14. querySelector() 选择器语法
  15. 24V转3.3V稳压芯片,低压降线性稳压器
  16. EAS中没有的核算项目新增
  17. 上周刚号召加班,这周立马双休,董明珠把互联网玩明白了……
  18. 计算机存储单元ASCI,在计算机存储器中,存储英文字母\quot;A\quot;时,存储的是它的( ) A.输入码B.ASCII码C - 作业在线问答...
  19. 一份价值百万的大数据分析报告如何炼成?
  20. css控制图片拉伸不变形,css+background实现 图片宽高自适应,拉伸裁剪不变形

热门文章

  1. IT行业热点----UT斯达康为什么人事巨变
  2. @dynamic与@synthesize
  3. https与ssl的工作原理
  4. 递推法之-------核电站问题(超简洁代码!!!)
  5. 如何更改手机信息服务器地址,更改手机服务器地址
  6. 区块链地址是什么?如何获取地址信息 | Tokenview
  7. 里恩ePro电子化的患者报告临床结局
  8. 一步步写STM32 OS【四】OS基本框架
  9. 第1章 字符串练习题
  10. 一个普通码农无法避免的时代碾压