通过前面几篇的简单解析,基本上ImageLoader能讲解完的都讲解完了,不过还有一个知识点没有分析。就是ImageLoader的如下方法:
其实找几个重载方法执行的流程也很简单,博主在此就按照分析displayImage方法来展开此篇博文!(同样,博主也假设你已经读过了博主的ImageLoader的其他几篇博文)
ImageLoader提供了两种方式的loadImage方法:没有返回值的loadImage系列重载方法和有返回Bitmap对象的loadImageSync方法。
先开始撸一遍loadImageSync的都的工作流程:
它的任务也很简单,就是根据图片的uri同步加载,然后处理成Bitmap对象供客户端ImageView使用。
loadImageSync最终都会调用方法参数最多的那个重载方法,所以直接把它拿来分析就够了。代码如下:
public Bitmap loadImageSync(String uri, ImageSize targetImageSize, DisplayImageOptions options) {
//1,提供默认的options
if (options == null) {
options = configuration.defaultDisplayImageOptions;
}
//主要是设置options的syncLoading属性为true
options = new DisplayImageOptions.Builder().cloneFrom(options).syncLoading(true).build();
SyncImageLoadingListener listener = new SyncImageLoadingListener();
loadImage(uri, targetImageSize, options, listener);
return listener.getLoadedBitmap();
}
上面代码的执行流程如下:
1)如果客户端传入的options为null,就使用ImageLoader默认的DisplayImageOptions
2)clone一个options,并设置其同步加载机制为true,表明为同步加载,生成bitmap对象
3)创建SyncImageLoadingListener 这个对象也很简单,前几篇博客中也提到过它(确切地说ImageLoadingListener)是的身影,可以通过这个接口监听ImageLaoder加载图片过程。而在这里SyncImageLoadingListener 内部持有Bitmap,当onLoadingComplete执行的时候给它赋值(具体流程参考博主其余几篇博客),并通过getLoadedBitmap方法得到这个Bitmap。
4)通过loadImage方法正式对图片进行加载,把生成的bitmap最终交给SyncImageLoadingListener 持有,并调用listener.getLoadedBitmap()返回。
private static class SyncImageLoadingListener extends SimpleImageLoadingListener {
private Bitmap loadedImage;
//在图片加载完成后调用此方法:不论是从内存加载还是文件、网络加载。
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
this.loadedImage = loadedImage;
}
public Bitmap getLoadedBitmap() {
return loadedImage;
}
}
既然要用到loadImage方法来完成loadImageSync的核心功能,很显然继续分析loadImage了。最终会调用ImageLoad如下的重载方法:
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
//此处省略部分代码
NonViewAware imageAware = new NonViewAware(uri, targetImageSize, ViewScaleType.CROP);
displayImage(uri, imageAware, options, listener, progressListener);
}
所以很简单,只是简单调用了diplayImage方法,然后通过这个方法加载对应的图片资源并生成bitmap对象,这样就完成了LoadImageSync的工作过程。需要注意的是我们知道在displayImage方法加载好图片资源并生成bitmap之后,是要交给DisplayBitmapTask来处理,并最终调用ViewAware的setImageBimtap让图片展示的。那么我们在调用loadImageSync方法的时候并没有传入我们的ImageView。对此种情况ImageLoader也做了处理:如上面代码所示,提供了一个NonViewAware ,这个NonViewAware跟前面博文分析的ImageViewAware一样,都是继承与ViewAware,而这个NonViewAware顾名思义就是没有实际的ImageView供我们使用。所以你也肯定能想象得到它的setImageBimtap肯定是什么也没做了(如下面代码所示):
@Override
public boolean setImageDrawable(Drawable drawable) { // Do nothing
return true;
}
@Override
public boolean setImageBitmap(Bitmap bitmap) { // Do nothing
return true;
}
本篇博文很简单(想比较深入的了解ImageLoader的工作流程的话,请参考博主的其他几篇博客),到此结束!