天天看點

使用Imageloader異步加載網絡圖檔

這裡隻做使用方法,其它不做過多介紹。

一、下載下傳類庫導入到LIB。

GITHUB上的下載下傳路徑為:https://github.com/nostra13/Android-Universal-Image-Loader ,下載下傳最新的庫檔案,并且導入到項目的LIB下便可以使用。

     二、AndroidManifest.xml中配置網絡和檔案讀寫的權限。 

由于使用過程中圖檔擷取需要使用網絡,并且有緩存設定,是以需要網絡和檔案讀寫的權限。

<uses-permission android:name="android.permission.INTERNET" /> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

   三、在Application中初始化配置項。

//ImageLoader配置方法

public static void initImageLoader(Context context) {

ImageLoaderConfiguration config = new ImageLoaderConfiguration  

    .Builder(context)  

     .memoryCacheExtraOptions(480, 800) // max width, max height,即儲存的每個緩存檔案的最大長寬  

     .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader, use it carefully (Better don't use it)/設定緩存的詳細資訊,最好不要設定這個  

     .threadPoolSize(3)//線程池内加載的數量  

     .threadPriority(Thread.NORM_PRIORITY - 2)  

     .denyCacheImageMultipleSizesInMemory()  

     .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通過自己的記憶體緩存實作  

     .memoryCacheSize(2 * 1024 * 1024)    

    .discCacheSize(50 * 1024 * 1024)    

     .discCacheFileNameGenerator(new Md5FileNameGenerator())//将儲存的時候的URI名稱用MD5 加密  

     .tasksProcessingOrder(QueueProcessingType.LIFO)  

     .discCacheFileCount(100) //緩存的檔案數量  

     .discCache(new UnlimitedDiscCache(cacheDir))//自定義緩存路徑  

     .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  

     .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)逾時時間  

     .writeDebugLogs() // Remove for release app  

     .build();//開始建構  

ImageLoader.getInstance().init(config);

}

在onCreate()方法中調用initImageLoader(getApplicationContext());

   四、執行個體化ImageLoader及顯示圖檔設定。

使用ImageLoader進行圖檔加載的時候,先要執行個體化ImageLoader,調用以下方法進行執行個體化,在每個布局裡面都要執行個體化後再使用。

protected ImageLoader imageLoader = ImageLoader.getInstance();

進行顯示的圖檔的各種格式DisplayImageOptions 的設定:

DisplayImageOptions options;  

options = new DisplayImageOptions.Builder()  

.showImageOnLoading(R.drawable.ic_launcher) //設定圖檔在下載下傳期間顯示的圖檔  

 .showImageForEmptyUri(R.drawable.ic_launcher)//設定圖檔Uri為空或是錯誤的時候顯示的圖檔  

.showImageOnFail(R.drawable.ic_launcher)  //設定圖檔加載/解碼過程中錯誤時候顯示的圖檔

.cacheInMemory(true)//設定下載下傳的圖檔是否緩存在記憶體中  

.cacheOnDisc(true)//設定下載下傳的圖檔是否緩存在SD卡中  

.considerExifParams(true)  //是否考慮JPEG圖像EXIF參數(旋轉,翻轉)

.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//設定圖檔以如何的編碼方式顯示  

.bitmapConfig(Bitmap.Config.RGB_565)//設定圖檔的解碼類型//  

.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions)//設定圖檔的解碼配置  

//.delayBeforeLoading(int delayInMillis)//int delayInMillis為你設定的下載下傳前的延遲時間

//設定圖檔加入緩存前,對bitmap進行設定  

//.preProcessor(BitmapProcessor preProcessor)  

.resetViewBeforeLoading(true)//設定圖檔在下載下傳前是否重置,複位  

.displayer(new RoundedBitmapDisplayer(20))//是否設定為圓角,弧度為多少  

.displayer(new FadeInBitmapDisplayer(100))//是否圖檔加載好後漸入的動畫時間  

.build();//建構完成

以上配置配置可按實際需要修改,

以上配置中:

1).imageScaleType(ImageScaleType imageScaleType)  是設定 圖檔的縮放方式縮放類型mageScaleType:

              EXACTLY :圖像将完全按比例縮小的目标大小

              EXACTLY_STRETCHED:圖檔會縮放到目标大小完全

              IN_SAMPLE_INT:圖像将被二次采樣的整數倍

              IN_SAMPLE_POWER_OF_2:圖檔将降低2倍,直到下一減少步驟,使圖像更小的目标大小

              NONE:圖檔不會調整

   2).displayer(BitmapDisplayer displayer)   是設定圖檔的顯示方式顯示方式displayer:

              RoundedBitmapDisplayer(int roundPixels)設定圓角圖檔

              FakeBitmapDisplayer()這個類什麼都沒做

              FadeInBitmapDisplayer(int durationMillis)設定圖檔漸顯的時間

         SimpleBitmapDisplayer()正常顯示一張圖檔  

五、按需求調用顯示圖檔

1.加載預設配置圖檔:ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表圖檔的URL位址,imageView代表承載圖檔的IMAGEVIEW控件 

也可以在application中配置ImageLoaderConfiguration時配置統一的顯示配置:config..defaultDisplayImageOptions(options);config為ImageLoaderConfiguration,options為DisplayImageOptions。

2.加載自定義配置的一個圖檔:ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表圖檔的URL位址,imageView代表承載圖檔的IMAGEVIEW控件 , options代表DisplayImageOptions配置檔案 

3.圖檔加載時候帶加載情況的監聽

imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  

    @Override  

    public void onLoadingStarted() {  

        //開始加載的時候執行  

     }  

     @Override  

     public void onLoadingFailed(FailReason failReason) {        

        //加載失敗的時候執行  

     }   

     @Override   

     public void onLoadingComplete(Bitmap loadedImage) {  

        //加載成功的時候執行  

     }   

     @Override   

     public void onLoadingCancelled() {  

        //加載取消的時候執行    

     }});  

4.圖檔加載時候,帶監聽又帶加載進度條的情況

imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  

    @Override  

     public void onLoadingStarted() {  

        //開始加載的時候執行  

     }  

     @Override  

     public void onLoadingFailed(FailReason failReason) {        

        //加載失敗的時候執行  

     }      

     @Override      

     public void onLoadingComplete(Bitmap loadedImage) {  

        //加載成功的時候執行  

    }      

     @Override      

     public void onLoadingCancelled() {  

        //加載取消的時候執行  

     },new ImageLoadingProgressListener() {        

       @Override  

       public void onProgressUpdate(String imageUri, View view, int current,int total) {     

       //在這裡更新 ProgressBar的進度資訊  

       }  

     }); 

六、注意事項

1、權限必須加入

2、ImageLoaderConfiguration必須配置并且全局化的初始化這個配置ImageLoader.getInstance().init(config);

3、ImageLoader是根據ImageView的height,width确定圖檔的寬高。

4、如果經常出現OOM(别人那邊看到的,覺得很有提的必要)

    ①減少配置之中線程池的大小,(.threadPoolSize).推薦1-5;

    ②使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;

    ③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者        try.imageScaleType(ImageScaleType.EXACTLY);

  ④避免使用RoundedBitmapDisplayer.他會建立新的ARGB_8888格式的Bitmap對象;

  ⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();

以上内容有部分來源于:http://blog.csdn.net/vipzjyno1/article/details/23206387