universal-Image-Loader的介绍
一,universal-Image-Loader简介
在开发项目时经常会加载一些图片,可是对图片的处理比较繁琐,如果加载太多的话会出现OOM异常,为了解决这个问题universal-Image-Loader这个开源框架就出现了,简单来说universal-Image-Loader就是将图片加载到相应的控件上,但是不用担心对图片进行大量繁琐的操作。
它有以下特点:
- 可配置度高。支持任务线程池、下载器、解码器、内存及磁盘缓存、显示选项等等的配置。
- 包含内存缓存和磁盘缓存两级缓存。
- 支持多线程,支持异步和同步加载。
- 支持多种缓存算法、下载进度监听、ListView 图片错乱解决等。
二,universal-Image-Loader的工作原理
需要解释一下一些名词:
ImageLoaderEngine:任务分发器,负责分发LoadAndDisplayImageTask
和ProcessAndDisplayImageTask
给具体的线程池去执行,本文中也称其为engine
ImageAware:显示图片的对象,可以是ImageView
等。
ImageDownloader:图片下载器,负责从图片的各个来源获取输入流。
Cache:图片缓存,分为MemoryCache
和DiskCache
两部分。
MemoryCache:内存图片缓存,可向内存缓存缓存图片或从内存缓存读取图片。
DiskCache:本地图片缓存,可向本地磁盘缓存保存图片或从本地磁盘读取图片。
ImageDecoder:图片解码器,负责将图片输入流InputStream
转换为Bitmap
对象。
BitmapProcessor:图片处理器,负责从缓存读取或写入前对图片进行处理。
BitmapDisplayer:将Bitmap
对象显示在相应的控件ImageAware
上。
LoadAndDisplayImageTask:用于加载并显示图片的任务。
ProcessAndDisplayImageTask:用于处理并显示图片的任务
。
DisplayBitmapTask:用于显示图片的任务。
先看一张图就明白了
整个库分为ImageLoaderEngine
,Cache
及ImageDownloader
,ImageDecoder
,BitmapDisplayer
,BitmapProcessor
五大模块,其中Cache
分为MemoryCache
和DiskCache
两部分。
简单的讲就是ImageLoader
收到加载及显示图片的任务,并将它交给ImageLoaderEngine
,ImageLoaderEngine
分发任务到具体线程池去执行,任务通过Cache
及ImageDownloader
获取图片,中间可能经过BitmapProcessor
和ImageDecoder
处理,最终转换为Bitmap
交给BitmapDisplayer
在ImageAware
中显示。
三,应用流程图:
在具体应用中的流程:
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());
}
参数
config
为
ImageLoader
的配置信息,包括图片最大尺寸、任务线程池、磁盘缓存、下载器、解码器等等。
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>