Android开源框架universal-Image-Loader介绍

                    universal-Image-Loader的介绍

一,universal-Image-Loader简介

在开发项目时经常会加载一些图片,可是对图片的处理比较繁琐,如果加载太多的话会出现OOM异常,为了解决这个问题universal-Image-Loader这个开源框架就出现了,简单来说universal-Image-Loader就是将图片加载到相应的控件上,但是不用担心对图片进行大量繁琐的操作。

它有以下特点:

  • 可配置度高。支持任务线程池、下载器、解码器、内存及磁盘缓存、显示选项等等的配置。
  • 包含内存缓存和磁盘缓存两级缓存。
  • 支持多线程,支持异步和同步加载。
  • 支持多种缓存算法、下载进度监听、ListView 图片错乱解决等。

二,universal-Image-Loader的工作原理

需要解释一下一些名词:

ImageLoaderEngine:任务分发器,负责分发LoadAndDisplayImageTaskProcessAndDisplayImageTask给具体的线程池去执行,本文中也称其为engine

ImageAware:显示图片的对象,可以是ImageView

ImageDownloader:图片下载器,负责从图片的各个来源获取输入流

Cache:图片缓存,分为MemoryCacheDiskCache两部分。

MemoryCache:内存图片缓存,可向内存缓存缓存图片或从内存缓存读取图片。

DiskCache:本地图片缓存,可向本地磁盘缓存保存图片或从本地磁盘读取图片。

ImageDecoder:图片解码器,负责将图片输入流InputStream转换为Bitmap对象。

BitmapProcessor:图片处理器,负责从缓存读取或写入前对图片进行处理。

BitmapDisplayer:Bitmap对象显示在相应的控件ImageAware

LoadAndDisplayImageTask:用于加载并显示图片的任务

ProcessAndDisplayImageTask:用于处理并显示图片的任务

DisplayBitmapTask:用于显示图片的任务。

先看一张图就明白了

整个库分为ImageLoaderEngineCacheImageDownloaderImageDecoderBitmapDisplayerBitmapProcessor五大模块,其中Cache分为MemoryCacheDiskCache两部分。

简单的讲就是ImageLoader收到加载及显示图片的任务,并将它交给ImageLoaderEngineImageLoaderEngine分发任务到具体线程池去执行,任务通过CacheImageDownloader获取图片,中间可能经过BitmapProcessorImageDecoder处理,最终转换为Bitmap交给BitmapDisplayerImageAware中显示。


三,应用流程图:


在具体应用中的流程:

Step1,先将universal-Image-Loader这个开源的库导入项目中作为依赖库

Step2,在Application或Activity中初始化ImageLoader

public class MyApplication extends Application {
@Override
public void onCreate() {
	super.onCreate();
	initImageLoader(this);
}
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(); 
	ImageLoader.getInstance().init(config.build());
}
参数 configImageLoader的配置信息,包括图片最大尺寸、任务线程池、磁盘缓存、下载器、解码器等等。
Step3,下载图片,解析为Bitmap并在ImageView中显示
public class MainActivity extends Activity {
private String url="http://192.168.2.142:8080/images/1.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ImageView iv = (ImageView) findViewById(R.id.imageView);
		ImageLoader.getInstance().displayImage(url,iv,ImageLoaderOptions.pager_options);
	}	
}

Step4,创建ImageLoaderOptions类,它有两种选择:list_options和pager_options,小图片用list,大图片用pager

public class ImageLoaderOptions {
	public static DisplayImageOptions list_options = new DisplayImageOptions.Builder()
			.showImageOnLoading(R.drawable.ic_default)
			.showImageForEmptyUri(R.drawable.ic_default)
			.showImageOnFail(R.drawable.ic_default).cacheInMemory(true)// 在内存中会缓存该图片
			.cacheOnDisk(true)// 在硬盘中会缓存该图片
			.considerExifParams(true)// 会识别图片的方向信息
			.displayer(new FadeInBitmapDisplayer(500)).build();
	public static DisplayImageOptions pager_options = new DisplayImageOptions.Builder()
			.showImageForEmptyUri(R.drawable.ic_default)
			.showImageOnFail(R.drawable.ic_default)
			.resetViewBeforeLoading(true)//在显示图片之前先清空ImageView上的图片
			.cacheOnDisk(true)
			.imageScaleType(ImageScaleType.EXACTLY)//会对图片进一步的缩放
			.bitmapConfig(Bitmap.Config.RGB_565)
			.considerExifParams(true)
			.displayer(new FadeInBitmapDisplayer(300)).build();
	
}
Step5,在清单文件中添加网络权限和配置自定义的Application

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <span style="color:#FF0000;"><uses-permission android:name="android.permission.INTERNET"/></span>
    <application
       <span style="color:#FF0000;"> android:name="com.example.imageloaderdemo.MyApplication"</span>
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.imageloaderdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值