1.功能概要
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。
(1).使用多线程加载图片
(2).灵活配置ImageLoader的基本参数,包括线程数、缓存方式、图片显示选项等;
(3).图片异步加载缓存机制,包括内存缓存及SDCard缓存;
(4).采用监听器监听图片加载过程及相应事件的处理;
(5).配置加载的图片显示选项,比如图片的圆角处理及渐变动画。
2.简单实现
ImageLoader采用单例设计模式,ImageLoader imageLoader = ImageLoader.getInstance();得到该对象,每个ImageLoader采用单例设计模式,ImageLoader必须调用init()方法完成初始化。
- ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
- .memoryCacheExtraOptions(480, 800)
- .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
- .taskExecutor(...)
- .taskExecutorForCachedImages(...)
- .threadPoolSize(3)
- .threadPriority(Thread.NORM_PRIORITY - 1)
- .tasksProcessingOrder(QueueProcessingType.FIFO)
- .denyCacheImageMultipleSizesInMemory()
- .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
- .memoryCacheSize(2 * 1024 * 1024)
- .memoryCacheSizePercentage(13)
- .discCache(new UnlimitedDiscCache(cacheDir))
- .discCacheSize(50 * 1024 * 1024)
- .discCacheFileCount(100)
- .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
- .imageDownloader(new BaseImageDownloader(context))
- .imageDecoder(new BaseImageDecoder())
- .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
- .writeDebugLogs()
- .build();
-
- ImageLoader imageLoader = ImageLoader.getInstance();
- imageLoader.init(config);
-
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- .showStubImage(R.drawable.ic_stub)
- .showImageForEmptyUri(R.drawable.ic_empty)
- .showImageOnFail(R.drawable.ic_error)
- .resetViewBeforeLoading(false)
- .delayBeforeLoading(1000)
- .cacheInMemory(false)
- .cacheOnDisc(false)
- .preProcessor(...)
- .postProcessor(...)
- .extraForDownloader(...)
- .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
- .bitmapConfig(Bitmap.Config.ARGB_8888)
- .decodingOptions(...)
- .displayer(new SimpleBitmapDisplayer())
- .handler(new Handler())
- .build();
-
- imageLoader.displayImage(
- uri,
- imageView,
- options);
-
- imageLoader.loadImage(
- uri,
- options,
- new MyImageListener());
- class MyImageListener extends SimpleImageLoadingListener{
-
- @Override
- public void onLoadingStarted(String imageUri, View view) {
- imageView.setImageResource(R.drawable.loading);
- super.onLoadingStarted(imageUri, view);
- }
-
- @Override
- public void onLoadingFailed(String imageUri, View view,
- FailReason failReason) {
- imageView.setImageResource(R.drawable.no_pic);
- super.onLoadingFailed(imageUri, view, failReason);
- }
-
- @Override
- public void onLoadingComplete(String imageUri, View view,
- Bitmap loadedImage) {
- imageView.setImageBitmap(loadedImage);
- super.onLoadingComplete(imageUri, view, loadedImage);
- }
-
- @Override
- public void onLoadingCancelled(String imageUri, View view) {
- imageView.setImageResource(R.drawable.cancel);
- super.onLoadingCancelled(imageUri, view);
- }
-
- }
3.支持的Uri
- String imageUri = "http://site.com/image.png"; // from Web
- String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
- String imageUri = "content://media/external/audio/albumart/13"; // from content provider
- String imageUri = "assets://image.png"; // from assets
- String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
-
加载drawables下图片,可以通过ImageView.setImageResource(...) 而不是通过上面的ImageLoader.
4.缓冲至手机
默认不能保存缓存,必须通过下面的方式指定
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- ...
- .cacheInMemory(true)
- .cacheOnDisc(true)
- ...
- .build();
- ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
- ...
- .defaultDisplayImageOptions(options)
- ...
- .build();
- ImageLoader.getInstance().init(config);
-
- ImageLoader.getInstance().displayImage(imageUrl, imageView);
或者通过下面这种方式
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- ...
- .cacheInMemory(true)
- .cacheOnDisc(true)
- ...
- .build();
- ImageLoader.getInstance().displayImage(imageUrl, imageView, options);
由于缓存需要在外设中写入数据,故需要添加下面的权限
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
5.OutOfMemoryError
如果OutOfMemoryError错误很常见,可以通过下面的方式设置
(1).减少configuration中线程池的线程数目(.threadPoolSize(...)) 推荐为1 - 5
(2).display options通过.bitmapConfig(Bitmap.Config.RGB_565)设置. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888.
(3).使用configuration的memoryCache(new WeakMemoryCache())方法 或者不调用.cacheInMemory()方法
(4).display options通过.imageScaleType(ImageScaleType.IN_SAMPLE_INT) 或者 .imageScaleType(ImageScaleType.EXACTLY)方法
(4).避免使用RoundedBitmapDisplayer,它创建了一个新的ARGB_8888 Bitmap对象
6.内存缓存管理
通过imageLoaderConfiguration.memoryCache([new LruMemoryCache(1)]))对手机内存缓存进行管理
LruMemoryCache
|
API >= 9默认.it is moved to the head of a queue.
|
FreqLimitedMemoryCache
|
当超过缓存大小后,删除最近频繁使用的bitmap
|
LRULimitedMemoryCache
|
API < 9 默认.当超过缓存大小后,删除最近使用的bitmap
|
FIFOLimitedMemoryCache
|
FIFO rule is used for deletion when cache size limit is exceeded
|
LargestLimitedMemoryCache
|
The largest bitmap is deleted when cache size limit is exceeded
|
WeakMemoryCache
|
Unlimited cache
|
7.SDcard缓存管理
通过imageLoaderConfiguration.discCache([new TotalSizeLimitedDiscCache()]))对SD卡缓存进行管理
UnlimitedDiscCache
|
default The fastest cache, doesn‘t limit cache size
|
TotalSizeLimitedDiscCache
|
Cache limited by total cache size. If cache size exceeds specified limit then file with themost oldest lastusage date will be deleted
|
FileCountLimitedDiscCache
|
Cache limited by file count. If file count in cache directory exceeds specified limit then file with the most oldest last usage date will be deleted.
|
LimitedAgeDiscCache
|
Size-unlimited cache with limited files‘ lifetime. If age of cached file exceeds defined limit then it will be deleted from cache.
|
UnlimitedDiscCache is 30%-faster than other limited disc cache implementations.
Android_开源框架_AndroidUniversalImageLoader网络图片加载
原文:http://www.cnblogs.com/lgy0069/p/5220741.html