Android-Universal-Image-Loader是一個開源的UI組件程序,該項目的目的是提供一個可重複使用的儀器爲異步圖像加載,緩存和顯示。 android
(1).使用多線程加載圖片
(2).靈活配置ImageLoader的基本參數,包括線程數、緩存方式、圖片顯示選項等;
(3).圖片異步加載緩存機制,包括內存緩存及SDCard緩存;
(4).採用監聽器監聽圖片加載過程及相應事件的處理;
(5).配置加載的圖片顯示選項,好比圖片的圓角處理及漸變更畫。 git
ImageLoader採用單例設計模式,ImageLoader imageLoader = ImageLoader.getInstance();獲得該對象,每一個ImageLoader採用單例設計模式,ImageLoader必須調用init()方法完成初始化。 github
- // 1.完成ImageLoaderConfiguration的配置
- ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
- .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
- .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
- .taskExecutor(...)
- .taskExecutorForCachedImages(...)
- .threadPoolSize(3) // default
- .threadPriority(Thread.NORM_PRIORITY - 1) // default
- .tasksProcessingOrder(QueueProcessingType.FIFO) // default
- .denyCacheImageMultipleSizesInMemory()
- .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
- .memoryCacheSize(2 * 1024 * 1024)
- .memoryCacheSizePercentage(13) // default
- .discCache(new UnlimitedDiscCache(cacheDir))// default
- .discCacheSize(50 * 1024 * 1024) // 緩衝大小
- .discCacheFileCount(100) // 緩衝文件數目
- .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
- .imageDownloader(new BaseImageDownloader(context)) // default
- .imageDecoder(new BaseImageDecoder()) // default
- .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
- .writeDebugLogs()
- .build();
- // 2.單例ImageLoader類的初始化
- ImageLoader imageLoader = ImageLoader.getInstance();
- imageLoader.init(config);
- // 3.DisplayImageOptions實例對象的配置
- // 如下的設置再調用displayImage()有效,使用loadImage()無效
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- .showStubImage(R.drawable.ic_stub) // image在加載過程當中,顯示的圖片
- .showImageForEmptyUri(R.drawable.ic_empty) // empty URI時顯示的圖片
- .showImageOnFail(R.drawable.ic_error) // 不是圖片文件 顯示圖片
- .resetViewBeforeLoading(false) // default
- .delayBeforeLoading(1000)
- .cacheInMemory(false) // default 不緩存至內存
- .cacheOnDisc(false) // default 不緩存至手機SDCard
- .preProcessor(...)
- .postProcessor(...)
- .extraForDownloader(...)
- .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default
- .bitmapConfig(Bitmap.Config.ARGB_8888) // default
- .decodingOptions(...)
- .displayer(new SimpleBitmapDisplayer()) // default 能夠設置動畫,好比圓角或者漸變
- .handler(new Handler()) // default
- .build();
- // 4圖片加載
- // 4.1 調用displayImage
- imageLoader.displayImage(
- 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
- */
- imageView, // 對應的imageView控件
- options); // 與之對應的image顯示方式選項
- // 4.2 調用loadImage
- // 對於部分DisplayImageOptions對象的設置不起做用
- imageLoader.loadImage(
- uri,
- options,
- new MyImageListener()); //ImageLoadingListener
- 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);
- }
- }
加載drawables下圖片,能夠經過ImageView.setImageResource(...) 而不是經過上面的ImageLoader. 設計模式
默認不能保存緩存,必須經過下面的方式指定 緩存
或者經過下面這種方式 多線程
因爲緩存須要在外設中寫入數據,故須要添加下面的權限 less
若是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對象 異步
經過imageLoaderConfiguration.memoryCache([new LruMemoryCache(1)]))對手機內存緩存進行管理 ide
LruMemoryCache post
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
經過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.