Android开源项目 Universal imageloader 源码研究之项目框架

时间:2022-03-15 21:37:05

Universal imageloader 的代码并不复杂 重点是缓存,线程池任务

下面都用UML图进行了绘制

Android开源项目 Universal imageloader 源码研究之项目框架

基本使用流程就是 初始化配置,设置Options参数,最后Dispaly提交下载

    public static void initImageLoader(Context context) {

        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
config.threadPriority(Thread.NORM_PRIORITY - 2);
config.denyCacheImageMultipleSizesInMemory();
config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs();// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config.build());
}
            options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
ImageLoader.getInstance()
.displayImage(IMAGE_URLS[0], holder.imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) { } @Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) { } @Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { }
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) { }
});

Android开源项目 Universal imageloader 源码研究之项目框架

ImageLoader是入口,其它类包括Config和Option。 ImageLoaderEngine 为发动机,其它包括包装器,网络下载和解码

Android开源项目 Universal imageloader 源码研究之项目框架

磁盘缓存和内存缓存,包括了几种经典的算法 实现。

Android开源项目 Universal imageloader 源码研究之项目框架

Android开源项目 Universal imageloader 源码研究之项目框架

ImageLoader 回调里面没有 Bitmap数据提供 只是直接把Bitmap设置给ImageView对象

可以通过接口处理  BitmapProcessor

options = new DisplayImageOptions.Builder().
preProcessor(preProcessor).
postProcessor(postProcessor); //进入缓存之前
BitmapProcessor preProcessor = new BitmapProcessor() { @Override
public Bitmap process(Bitmap bitmap) {
return null;
} }; //显示给ImageView 之前处理
BitmapProcessor postProcessor = new BitmapProcessor() { @Override
public Bitmap process(Bitmap bitmap) {
return null;
} };