ImageLoader的简单解析(六)

通过前面几篇的简单解析,基本上ImageLoader能讲解完的都讲解完了,不过还有一个知识点没有分析。就是ImageLoader的如下方法:
ImageLoader的简单解析(六)_第1张图片
其实找几个重载方法执行的流程也很简单,博主在此就按照分析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的工作流程的话,请参考博主的其他几篇博客),到此结束!

你可能感兴趣的:(ImageLoader的简单解析(六))