1.功能概要
Android-Universal-Image-Loader是一個開源的UI組件程序,該項目的目的是提供一個可重復使用的儀器為異步圖像加載,緩存和顯示。
(1).使用多線程加載圖片
(2).靈活配置ImageLoader的基本參數,包括線程數、緩存方式、圖片顯示選項等;
(3).圖片異步加載緩存機制,包括內存緩存及SDCard緩存;
(4).采用監聽器監聽圖片加載過程及相應事件的處理;
(5).配置加載的圖片顯示選項,比如圖片的圓角處理及漸變動畫。
2.簡單實現
ImageLoader采用單例設計模式,ImageLoader imageLoader = ImageLoader.getInstance();得到該對象,每個ImageLoader采用單例設計模式,ImageLoader必須調用init()方法完成初始化。
- // 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);
- }
- }
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); // Do it on Application start
- ImageLoader.getInstance().displayImage(imageUrl, imageView); /*
- 默認為defaultDisplayImageOptions設定的options對象,此處不用指定options對象 */
或者通過下面這種方式
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- ...
- .cacheInMemory(true)
- .cacheOnDisc(true)
- ...
- .build();
- ImageLoader.getInstance().displayImage(imageUrl, imageView, options); //此處指定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.
- 頂
- 1
- 踩