(universal Image Loader)UIL 使用 (1)
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)相关推荐
- (universal Image Loader)UIL 使用 (2)
系列(universal Image Loader)UIL 使用 (1) UIL 使用 3 简单介绍了UIL的最基本的使用方法,这次继续老学习UIL的使用 这次只是分析学习一个方法 <spa ...
- android universal image loader 缓冲原理详解
1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法 参考文章: (1)universal image loader在listview/ ...
- 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解
在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个 ...
- 全网最全Android开发工具,Android开发框架大全
涵盖Android方方面面的技术, 目前保持更新. 时刻与Android开发流行前沿同步. 目录 一.工具 Android开发工具 在线工具宝典大全 二.框架 *缓存框架* DiskLruCache ...
- 【Android 进阶】Android优秀框架
根据上图我们依次说明: 1,DiskLruCache 硬盘缓存最佳方案(Google提供的一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)) DiskLruC ...
- 图片加载框架之UIL
1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...
- 从UIL库谈Android图片加载中需要注意的事情
Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...
最新文章
- 掌握Tiles框架 (二)-- Tiles布局和定义
- 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
- 使用函数PIVOT现实数据行转列
- CentOS 6.0安装JDK7
- hack 入侵 142 主机的过程
- javax.net.ssl.SSLException MESSAGE: closing inbound before receiving peer‘s close_notify
- Python弹窗提示警告框MessageBox
- 矩阵运算和一些基本的几何运算
- HDR与ToneMapping
- java之xml编程
- java关闭服务_实现优雅地关闭Docker中的java服务
- LNMP 常见问题(FAQ)
- 网络风险成为中国企业新挑战
- querySelector() 选择器语法
- 24V转3.3V稳压芯片,低压降线性稳压器
- EAS中没有的核算项目新增
- 上周刚号召加班,这周立马双休,董明珠把互联网玩明白了……
- 计算机存储单元ASCI,在计算机存储器中,存储英文字母\quot;A\quot;时,存储的是它的( ) A.输入码B.ASCII码C - 作业在线问答...
- 一份价值百万的大数据分析报告如何炼成?
- css控制图片拉伸不变形,css+background实现 图片宽高自适应,拉伸裁剪不变形