Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用簡單介紹
一,前言:為什么要引入Android-Universal-Image-Loader?
眾所周知,簡單的幾個ImageView載入幾個圖像資源、或者這幾個圖像資源是從本地載入時無需考慮過多直接載入就可以。但當成千上百個ImageView載入成千上百個圖像、尤其是當這些圖片還是從網絡中異步獲取,那么須要考慮的問題細節非常多非常繁瑣且easy出錯。如今隨便舉例當中幾條:
(1)最主要的問題,網絡不可靠。可能在不可靠網絡載入過程中。圖片載入發生難以預估的失敗。
(2)已經從網絡或本地中載入成功的圖片,應該避免反復載入,反復載入造成網絡流量浪費。以及設備計算資源的反復浪費。因此須要考慮圖片緩存策略。
緩存分為兩級緩存:第一級:內存緩存,第二級:“硬盤”緩存(一般是手機的外置存儲如SD卡和內置存儲)。實現這種層級緩存策略須要自己維護和組織。
內存緩存能夠考慮使用Android的LruCache。詳情參考我的另外兩篇文章:
a、《使用新式LruCache代替SoftReference緩存圖片,Android異步載入圖片》,文章鏈接地址:http://blog.csdn.net/zhangphil/article/details/43667415
b、或者自己依照LruCache設計思路實現和管理內存管理,《基于Java LinkedList,實現Android大數據緩存策略》,文章鏈接地址:http://blog.csdn.net/zhangphil/article/details/44116885
硬盤緩存則要自己建立緩存索引和緩存文件結構(怎樣建立緩存文件夾?內存在何時機把硬盤緩存的圖片增加等等問題)。
(3)設想這一種情況,在一個Android豎直方向上ListView中有成千上萬條圖片item,每條item中的圖片均需從網絡獲取。
用戶手指在屏幕上高速滑動,滑動過程中,極有可能可見視野內的圖片還沒有載入完畢后,用戶已經高速的往下滑看以下的圖片去了。
而上面已經消失的圖片載入線程假設置之不理任由其運作,那么,當用戶在不斷的下拉和上拉過程中,將會造成線程不斷的重建和執行,內存開銷極大。而對于用戶來來,最緊迫的當前可見視野的圖片載入顯示可能由于線程過多而被無限期遲延到最后顯示。
這樣的情況一般得應對策略師自己維護和管理一個線程池(關于Java線程池。詳情請參考我的另外一篇文章:《Java線程池:ExecutorService。Executors》,文章鏈接地址:http://blog.csdn.net/zhangphil/article/details/43898637 )。自己管理和維護多線程下載任務隊列。顯然。須要考慮的線程隊列問題非常多,非常繁瑣。
等等還有非常多未列舉出來的細節問題。
為了避免反復造輪子,這樣的情況下最好考慮使用一些業界比較成熟穩定的開源框架。
Android ImageLoader(Android-Universal-Image-Loader),是github上的一個第三方開源圖像載入庫。該項目在github上的鏈接地址:
https://github.com/nostra13/Android-Universal-Image-Loader?
Android-Universal-Image-Loader主要應用領域是ImageView載入圖片。
該開源框架對上述問題給予了充分的解決。并提供了其它額外的附加功能(如載入的圖片尺寸。載入動畫等等)。
二、Android-Universal-Image-Loader使用簡單介紹。
首先到Android-Universal-Image-Loader官方網址下載項目包。使用能夠分為兩種方法
(1)把Android-Universal-Image-Loader的所有實現源碼(*.java)放入到自己的項目文件夾src下,當作是自己的源碼使用。
(2)導入Android-Universal-Image-Loader的jar庫文件。比方universal-image-loader-1.9.4.jar。
兩種方式都能夠。看個人偏好。
我用的是第一種方法。這樣能夠方便查閱甚至直接二次定制改動Android-Universal-Image-Loader的源碼為自己所用。
代碼結構層次如圖:
然后就能夠直接使用,現給出一個演示樣例。
測試用的MainActivity.java:
package zhangphil.imageloader;import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;public class MainActivity extends ListActivity {private ImageLoader mImageLoader = null;// 載入的圖片資源URLprivate final String ZHANGPHIL_CSDN_LOGO_URL = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg";// 載入的數目。假定數據總量非常大private final int ITEM_COUNT = 10000;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ListView lv = this.getListView();ArrayAdapter adapter = new MyArrayAdapter(this, -1);lv.setAdapter(adapter);mImageLoader = ImageLoader.getInstance();mImageLoader.init(getImageLoaderConfiguration());}private ImageLoaderConfiguration getImageLoaderConfiguration() {ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).threadPoolSize(3)// 線程數量.threadPriority(Thread.NORM_PRIORITY)// 線程優先級.tasksProcessingOrder(QueueProcessingType.FIFO).denyCacheImageMultipleSizesInMemory().memoryCacheSize(1024 * 1024 * 10) // 內存緩存的容量10MB.diskCacheFileCount(100)// 緩存的文件數量.diskCacheSize(1024 * 1014 * 100)// 硬盤緩存的大小100MB.writeDebugLogs()// 輸出日志.build();return config;}private DisplayImageOptions getDisplayImageOptions() {DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.loading)// 載入過程中顯示的圖片.showImageForEmptyUri(R.drawable.ic_launcher)// 空URI顯示的圖片.showImageOnFail(R.drawable.error)// 載入失敗時候顯示內容.cacheInMemory(true)// 緩存到內存.cacheOnDisk(true)// 緩存到硬盤.considerExifParams(true).displayer(new FadeInBitmapDisplayer(1000))// 淡入載入圖片顯示.build();return options;}private class MyArrayAdapter extends ArrayAdapter {private LayoutInflater inflater;private int resId = R.layout.item;private DisplayImageOptions mDisplayImageOptions;public MyArrayAdapter(Context context, int resource) {super(context, resource);inflater = LayoutInflater.from(getContext());mDisplayImageOptions = getDisplayImageOptions();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null)convertView = inflater.inflate(resId, null);ImageView imageView = (ImageView) convertView.findViewById(R.id.image);mImageLoader.displayImage(ZHANGPHIL_CSDN_LOGO_URL, imageView,mDisplayImageOptions);return convertView;}@Overridepublic int getCount() {return ITEM_COUNT;}}// private File getMyCacheDir() {// File sdRoot = Environment.getExternalStorageDirectory();// String myImageLoaderCacheFileDir = "ImageLodaerCache";// File cacheFileDir = new File(sdRoot, myImageLoaderCacheFileDir);// return cacheFileDir;// }
}
Item.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/image" ></ImageView>
素材error.png和Loading.gif能夠依據個人的須要選取不同的圖片資源。
ImageLoader在使用之前須要做一些初始化工作。配置ImageLoaderConfiguration和DisplayImageOptions 。
然后就能夠直接使用ImageLoader的displayImage()方法從網絡或本地存儲中異步載入圖片資源。而關于圖片資源的緩存和異步下載線程池隊列則交由ImageLoader為我們妥善在后臺管理好。
轉載于:https://www.cnblogs.com/zsychanpin/p/6949604.html
總結
以上是生活随笔為你收集整理的Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。