图片加载框架--ImageLoader实现(二)
来源:互联网 发布:自动驾驶分级 知乎 编辑:程序博客网 时间:2024/04/29 23:30
前言
上篇简单介绍了UniversalImageLoader的使用,分析了下源代码,大致可以进行如下划分,本文将分析图片加载的Imageloader实现,。
正文
通过ImageLoader实例对象,调用public void displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener)发放将开始加载图片,具体过程可以分为几个阶段:
合法性检查
主要是初始化检查和参数检查,可能会抛出异常或是下载不受干扰可以继续;有传入的图片地址为空,imageview为空,图片配置实例为空,过程监听接口为空四种情况。
if (configuration == null) { throw new RuntimeException(ERROR_NOT_INIT); } if (imageView == null) { Log.w(TAG, ERROR_WRONG_ARGUMENTS); return; } if (listener == null) { listener = emptyListener; } if (options == null) { options = configuration.defaultDisplayImageOptions; }if (uri == null || uri.length() == 0) { cacheKeyForImageView.remove(imageView); listener.onLoadingStarted(); if (options.isShowImageForEmptyUri()) { imageView.setImageResource(options.getImageForEmptyUri()); } else { imageView.setImageBitmap(null); } listener.onLoadingComplete(null); return; }
如果没有初始化ImageLoader是比较严重的,将直接抛出运行时异常,控件ImageView为空时不影响,可以直接退出,不再下载,图片配置和监听接口为空则将启用默认值,至于图片url的话,由于初始化时已经实例化了默认值的情形,所以将显示本地设置的默认图片,同时将控件移出HashMap。
加载准备
这里的准备操作一个是获取图片的尺寸参数,然后根据这个参数和url生成标记ImageView的key,最后以key-value的形式存入HashMap中备用,
targetSize = getImageSizeScaleTo(imageView); String memoryCacheKey = MemoryCacheKeyUtil.generateKey(uri, targetSize); cacheKeyForImageView.put(imageView, memoryCacheKey);
加载操作
加载分为调用内存缓存和本地缓存/网络下载,根据上一步加载准备中得到的key获取bitmap,这个过程比较发杂,单独介绍。
if (bmp != null && !bmp.isRecycled()) { if (configuration.loggingEnabled) Log.i(TAG, String.format(LOG_LOAD_IMAGE_FROM_MEMORY_CACHE, memoryCacheKey)); listener.onLoadingStarted(); Bitmap displayedBitmap = options.getDisplayer().display(bmp, imageView); imageView.setImageBitmap(displayedBitmap); listener.onLoadingComplete(bmp); }
根据得到的bitmap,如果不为空且未被标记为回收状态,那么就可以使用这个缓存的bitmap,调用监听接口的onLoadingStarted()处理一些加载钱的操作,然后对bitmap做一些显示前的操作,这个就用到传入进来的图片显示的option配置,如果没传这个值,那启用默认值,应该是不对bitmap操作,这个默认的option使用SimpleBitmapDisplayer 实例,查看其源代码,果然,是直接将bitmap设置给ImageView然后对外返回原来的Bitmap,对于这种情况后面的在此设置bitmap给imageview其实有些累赘,重复操作了。
public final class SimpleBitmapDisplayer implements BitmapDisplayer { @Override public Bitmap display(Bitmap bitmap, ImageView imageView) { imageView.setImageBitmap(bitmap); return bitmap; } }
接下来调用监听接口的onLoadingComlete();到显示内存缓存图片的操作就结束了,下面介绍第二种情况,就是从磁盘缓存/网新下载图片。
先调用监听接口的onLoadingStarted();接着显示一个下载过程中的图片或则干脆在下载时不显示任何图片。接着检查一下线程池是否初始化并正常工作中checkExecutors(),查看源代码可以发现,项目用与下载的的task其实是通过ExecutorService来管理,如果还不知道什么是ExecutorService赶紧去补一下java的多线程并发编程吧。
private void checkExecutors() { if (imageLoadingExecutor == null || imageLoadingExecutor.isShutdown()) { imageLoadingExecutor = Executors.newFixedThreadPool(configuration.threadPoolSize, configuration.displayImageThreadFactory); } if (cachedImageLoadingExecutor == null || cachedImageLoadingExecutor.isShutdown()) { cachedImageLoadingExecutor = Executors.newFixedThreadPool(configuration.threadPoolSize, configuration.displayImageThreadFactory); } }
为了下载图片这里把必要的图片信息做了一个封装传给工作线程。ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageView, targetSize, options, listener, getLockForUri(uri));
现在一起看一下他的工作线程是怎么写的。LoadAndDisplayImageTask displayImageTask = new LoadAndDisplayImageTask(configuration, imageLoadingInfo, new Handler());
这里的最后一个参数是我们熟悉的Handler 实例,可以预测这个task类应该是Runnale的是子类,在run()中根据情况向handler发送处理操作请求。(未完待续)
- 图片加载框架--ImageLoader实现(二)
- 图片加载框架--ImageLoader实现(二)
- 图片加载框架--ImageLoader实现(二)
- Imageloader图片加载框架
- 图片加载框架-ImageLoader
- ImageLoader 图片加载框架
- ImageLoader 图片加载框架
- ImageLoader图片加载框架
- Android图片加载框架ImageLoader
- Android_图片加载框架---ImageLoader
- imageLoader加载图片的框架
- 简单的图片加载框架——ImageLoader的实现
- ImageLoader实现图片异步加载
- ImageLoader加载图片,实现原理。。。
- Android 框架-ImageLoader 图片加载框架
- Android UI-开源框架ImageLoader(异步加载图片)
- 异步加载图片框架ImageLoader的使用
- ImageLoader异步加载图片框架浅谈
- 关于反编译的一点总结
- 要下载资源没分了??
- 基于角色的权限访问设计
- 习惯成为朋友
- arm-linux一句话备忘录
- 图片加载框架--ImageLoader实现(二)
- 使用RoboVM来让JavaFX运行在IOS设备上
- Square Coins
- Ubuntu 配置sendmail
- cocos2dx(2)代码基本结构
- U盘安装centos 6.3教程
- kmeans聚类算法学习
- 今天學到瞭什麽
- 从AD批量同步用户信息到 User Info list (SiteUserInfoList) http://sitecollectionURL/_catalogs/users/detail.aspx