Android-Universal-Image-Loader三大組件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration詳解

來源:互聯網
上載者:User

標籤:.com   ram   很多   reason   count   get   pre   universal   and   

Android-Universal-Image-Loader三大組件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration詳解 一、介紹

 Android-Universal-Image-Loader是一個開源的UI組件程式,該項目的目的是提供一個可重複使用的儀器為非同步映像載入,緩衝和顯示。所以,如果你的程式裡需要這個功能的話,那麼不妨試試它。因為已經封裝好了一些類和方法。我們 可以直接拿來用了。而不用重複去寫了。其實,寫一個這方面的程式還是比較麻煩的,要考慮多線程緩衝,記憶體溢出等很多方面。

二、具體使用

一個好的類庫的重要特徵就是可配置性強。我們先簡單使用Android-Universal-Image-Loader,一般情況下使用預設配置就可以了。

下面的執行個體利用Android-Universal-Image-Loader將網狀圖片載入到圖片牆中。

 1 public class BaseActivity extends Activity { 2     ImageLoader imageLoader; 3     @Override 4     protected void onCreate(Bundle savedInstanceState) { 5           // Create global configuration and initialize ImageLoader with this configuration 6         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 7             .build(); 8         ImageLoader.getInstance().init(config); 9         super.onCreate(savedInstanceState);10     }11 }  
  1 public class MainActivity extends BaseActivity {  2   3     @Override  4     protected void onCreate(Bundle savedInstanceState) {  5         super.onCreate(savedInstanceState);  6         setContentView(R.layout.activity_main);  7     8         ImageLoader imageLoader = ImageLoader.getInstance();  9  10         GridView gridView = (GridView) this.findViewById(R.id.grdvImageWall); 11         gridView.setAdapter(new PhotoWallAdapter(Constants.IMAGES)); 12     } 13  14     static class ViewHolder { 15         ImageView imageView; 16         ProgressBar progressBar; 17     } 18  19     public class PhotoWallAdapter extends BaseAdapter { 20         String[] imageUrls; 21         ImageLoader imageLoad; 22         DisplayImageOptions options; 23         LinearLayout gridViewItem; 24  25         public PhotoWallAdapter(String[] imageUrls) { 26             assert imageUrls != null; 27             this.imageUrls = imageUrls; 28  29             options = new DisplayImageOptions.Builder() 30                     .showImageOnLoading(R.drawable.ic_stub) // resource or 31                                                             // drawable 32                     .showImageForEmptyUri(R.drawable.ic_empty) // resource or 33                                                                 // drawable 34                     .showImageOnFail(R.drawable.ic_error) // resource or 35                                                             // drawable 36                     .resetViewBeforeLoading(false) // default 37                     .delayBeforeLoading(1000).cacheInMemory(false) // default 38                     .cacheOnDisk(false) // default 39                     .considerExifParams(false) // default 40                     .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 41                     .bitmapConfig(Bitmap.Config.ARGB_8888) // default 42                     .displayer(new SimpleBitmapDisplayer()) // default 43                     .handler(new Handler()) // default 44                     .build(); 45             this.imageLoad = ImageLoader.getInstance(); 46  47         } 48  49         @Override 50         public int getCount() { 51             return this.imageUrls.length; 52         } 53  54         @Override 55         public Object getItem(int position) { 56             if (position <= 0 || position >= this.imageUrls.length) { 57                 throw new IllegalArgumentException( 58                         "position<=0||position>=this.imageUrls.length"); 59             } 60             return this.imageUrls[position]; 61         } 62  63         @Override 64         public long getItemId(int position) { 65             return position; 66         } 67  68         @Override 69         public View getView(int position, View convertView, ViewGroup parent) { 70             // 判斷這個image是否已經在緩衝當中,如果沒有就下載 71             final ViewHolder holder; 72             if (convertView == null) { 73                 holder = new ViewHolder(); 74                 gridViewItem = (LinearLayout) getLayoutInflater().inflate( 75                         R.layout.image_wall_item, null); 76                 holder.imageView = (ImageView) gridViewItem 77                         .findViewById(R.id.item_image); 78                 holder.progressBar = (ProgressBar) gridViewItem 79                         .findViewById(R.id.item_process); 80                 gridViewItem.setTag(holder); 81                 convertView = gridViewItem; 82             } else { 83                 holder = (ViewHolder) gridViewItem.getTag(); 84             } 85             this.imageLoad.displayImage(this.imageUrls[position], 86                     holder.imageView, options, 87                     new SimpleImageLoadingListener() { 88  89                         @Override 90                         public void onLoadingStarted(String imageUri, View view) { 91                             holder.progressBar.setProgress(0); 92                             holder.progressBar.setVisibility(View.VISIBLE); 93                         } 94  95                         @Override 96                         public void onLoadingFailed(String imageUri, View view, 97                                 FailReason failReason) { 98                             holder.progressBar.setVisibility(View.GONE); 99                         }100 101                         @Override102                         public void onLoadingComplete(String imageUri,103                                 View view, Bitmap loadedImage) {104                             holder.progressBar.setVisibility(View.GONE);105                         }106 107                     }, new ImageLoadingProgressListener() {108 109                         @Override110                         public void onProgressUpdate(String imageUri,111                                 View view, int current, int total) {112                             holder.progressBar.setProgress(Math.round(100.0f113                                     * current / total));114                         }115                     }); // 通過URL判斷圖片是否已經下載116             return convertView;117         }118 119     }120 }

裡面主要的對象都用        反白了。

三者的關係

ImageLoaderConfiguration是針對圖片緩衝的全域配置,主要有線程類、緩衝大小、磁碟大小、圖片下載與解析、日誌方面的配置。

ImageLoader是具體下載圖片,緩衝圖片,顯示圖片的具體執行類,它有兩個具體的方法displayImage(...)、loadImage(...),但是其實最終他們的實現都是displayImage(...)。

DisplayImageOptions用於指導每一個Imageloader根據網狀圖片的狀態(空白、下載錯誤、正在下載)顯示對應的圖片,是否將緩衝載入到磁碟上,下載完後對圖片進行怎麼樣的處理。

從三者的協作關係上看,他們有點像廚房規定、廚師、客戶個人口味之間的關係。ImageLoaderConfiguration就像是廚房裡面的規定,每一個廚師要怎麼著裝,要怎麼保持廚房的乾淨,這是針對每一個廚師都適用的規定,而且不允許個人化改變。ImageLoader就像是具體做菜的廚師,負責具體菜譜的製作。DisplayImageOptions就像每個客戶的偏好,根據客戶是重口味還是清淡,每一個imageLoader根據DisplayImageOptions的要求具體執行。

 

ImageLoaderConfiguration

在上面的範例程式碼中,我們使用ImageLoaderConfiguration的預設配置,下面給出ImageLoaderConfiguration比較詳盡的配置,從下面的配置中,可以看出ImageLoaderConfiguration的配置主要是全域性的配置,主要有線程類、緩衝大小、磁碟大小、圖片下載與解析、日誌方面的配置。

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions        .diskCacheExtraOptions(480, 800, 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        .diskCache(new UnlimitedDiscCache(cacheDir)) // default        .diskCacheSize(50 * 1024 * 1024)        .diskCacheFileCount(100)        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default        .imageDownloader(new BaseImageDownloader(context)) // default        .imageDecoder(new BaseImageDecoder()) // default        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default        .writeDebugLogs()        .build();

ImageLoaderConfiguration的主要職責就是記錄相關的配置,它的內部其實就是一些欄位的集合(如下面的原始碼)。它有一個builder的內部類,這個類中的欄位跟ImageLoaderConfiguration中的欄位完全一致,它有一些預設值,通過修改builder可以配置ImageLoaderConfiguration。

 View Code

 

 Display Options

每一個ImageLoader.displayImage(...)都可以使用Display Options

DisplayImageOptions options = new DisplayImageOptions.Builder()        .showImageOnLoading(R.drawable.ic_stub) // resource or drawable        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable        .showImageOnFail(R.drawable.ic_error) // resource or drawable        .resetViewBeforeLoading(false)  // default        .delayBeforeLoading(1000)        .cacheInMemory(false) // default        .cacheOnDisk(false) // default        .preProcessor(...)        .postProcessor(...)        .extraForDownloader(...)        .considerExifParams(false) // default        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default        .bitmapConfig(Bitmap.Config.ARGB_8888) // default        .decodingOptions(...)        .displayer(new SimpleBitmapDisplayer()) // default        .handler(new Handler()) // default        .build();

 Display Options的主要職責就是記錄相關的配置,它的內部其實就是一些欄位的集合(如下面的原始碼)。它有一個builder的內部類,這個類中的欄位跟DisplayOption中的欄位完全一致,它有一些預設值,通過修改builder可以配置DisplayOptions。

 View Code

 

 

參考連結

http://blog.csdn.net/wangjinyu501/article/details/8091623

https://github.com/nostra13/Android-Universal-Image-Loader

http://www.intexsoft.com/blog/item/74-universal-image-loader-part-3.html

Android-Universal-Image-Loader三大組件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.