日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ImageLoader实现图片异步加载

發(fā)布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ImageLoader实现图片异步加载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ImageLoader是一個廣泛使用的圖片庫,在向網(wǎng)絡(luò)請求圖片時,使用imageView和smartView常會產(chǎn)生outofmemory錯誤,這時ImageLoader可以起到很大的作用,主要有如下功能

一、功能特性:

  • 多線程異步加載和顯示圖片(圖片來源于網(wǎng)絡(luò)、sd卡、assets文件夾,drawable文件夾(不能加載9patch),新增加載視頻縮略圖)
  • "http://site.com/image.png" // from Web"file:///mnt/sdcard/image.png" // from SD card"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)"content://media/external/images/media/13" // from content provider"content://media/external/video/media/13" // from content provider (video thumbnail)"assets://image.png" // from assets"drawable://" + R.drawable.img // from drawables (non-9patch images)
  • 支持通過“l(fā)istener”監(jiān)視加載的過程,可以暫停加載圖片,在經(jīng)常使用的ListView、GridView中,可以設(shè)置滑動時暫停加載,停止滑動時加載圖片(便于節(jié)約流量,在一些優(yōu)化中可以使用)

  • 緩存圖片至內(nèi)存時,可以更加高效的工作

  • 高度可定制化(可以根據(jù)自己的需求進(jìn)行各種配置,如:線程池,圖片下載器,內(nèi)存緩存策略等)

  • 支持圖片的內(nèi)存緩存,SD卡(文件)緩存

  • 在網(wǎng)絡(luò)速度較慢時,還可以對圖片進(jìn)行加載并設(shè)置下載監(jiān)聽

  • 二 配置詳解

  • 載jar包放在libs文件夾中
  • AndroidManifest.xml
  • <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" />

    3.在應(yīng)用中配置ImageLoaderConfiguration參數(shù)(只能配置一次,如多次配置,則默認(rèn)第一次的配置參數(shù))
    有兩種配置方法

    a、使用默認(rèn)設(shè)置

    public class CustomApplication extends Application{@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomApplication.this));}}

    b、使用自定義配置

    public class ImageLoaderApplication extends Application {public void onCreate() {super.onCreate();initImageLoader(getApplicationContext());}public static void initImageLoader(Context context) {//緩存文件的目錄File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每個緩存文件的最大長寬 .threadPoolSize(3) //線程池內(nèi)加載的數(shù)量.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().diskCacheFileNameGenerator(new Md5FileNameGenerator()) //將保存的時候的URI名稱用MD5 加密.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通過自己的內(nèi)存緩存實(shí)現(xiàn).memoryCacheSize(2 * 1024 * 1024) // 內(nèi)存緩存的最大值.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)緩存的最大值.tasksProcessingOrder(QueueProcessingType.LIFO)// 由原先的discCache -> diskCache.diskCache(new UnlimitedDiscCache(cacheDir))//自定義緩存路徑 .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超時時間 .writeDebugLogs() // Remove for release app.build();//全局初始化此配置 ImageLoader.getInstance().init(config);} }

    注意需要在manifest文件中聲明Application

    android:name="com.zj.more.CustomApplication"

    4、圖片顯示操作

    顯示圖片

    1、 ImageLoader.getInstance().displayImage(uri, imageView);2、 ImageLoader.getInstance().displayImage(uri, imageView, options);3、 ImageLoader.getInstance().displayImage(uri, imageView, listener);4、 ImageLoader.getInstance().displayImage(uri, imageView, options, listener);5、 ImageLoader.getInstance().displayImage(uri, imageView, options, listener, progressListener);

    參數(shù)解析:
    imageUrl 圖片的URL地址
    imageView 顯示圖片的ImageView控件
    options DisplayImageOptions配置信息
    listener 圖片下載情況的監(jiān)聽
    progressListener 圖片下載進(jìn)度的監(jiān)聽

    1)方法1:最簡單的方式,我們只需要定義要顯示的圖片的URL和要顯示圖片的ImageView。這種情況下,圖片的顯示選項(xiàng)會使用默認(rèn)的配置

    2)方法2:加載自定義配置的一個圖片

    3)方法3:加載帶監(jiān)聽的一個圖片

    4)方法4:加載自定義配置且?guī)ПO(jiān)聽的一個圖片

    5) 方法5:加載自定義配置且?guī)ПO(jiān)聽和進(jìn)度條的一個圖片

    ImageLoader.getInstance().displayImage(uri, imageView, options,new ImageLoadingListener() {@Overridepublic void onLoadingStarted(String arg0, View arg1) {//開始加載}@Overridepublic void onLoadingFailed(String arg0, View arg1,FailReason arg2) {//加載失敗}@Overridepublic void onLoadingComplete(String arg0, View arg1,Bitmap arg2) {//加載成功}@Overridepublic void onLoadingCancelled(String arg0, View arg1) {//加載取消}}, new ImageLoadingProgressListener() {@Overridepublic void onProgressUpdate(String imageUri, View view,int current, int total) {//加載進(jìn)度}});

    實(shí)例

    a、在BaseActivity中得到單例的imageLoader

    public abstract class BaseActivity extends Activity {protected ImageLoader imageLoader;/*** 初始化布局資源文件*/public abstract int initResource();/*** 初始化組件*/public abstract void initComponent();/*** 初始化數(shù)據(jù)*/public abstract void initData();/*** 添加監(jiān)聽*/public abstract void addListener();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(initResource());imageLoader = ImageLoader.getInstance();initComponent();initData();addListener();}}

    b、listView實(shí)現(xiàn)加載圖片

    public class ImageListActivity extends BaseActivity {private ListView mListImageLv;private DisplayImageOptions options; // 設(shè)置圖片顯示相關(guān)參數(shù)private String[] imageUrls; // 圖片路徑@Overridepublic int initResource() {return R.layout.activity_list;}@Overridepublic void initComponent() {mListImageLv = (ListView) findViewById(R.id.lv_image);}@Overridepublic void initData() {Bundle bundle = getIntent().getExtras();imageUrls = bundle.getStringArray(Constants.IMAGES);// 使用DisplayImageOptions.Builder()創(chuàng)建DisplayImageOptionsoptions = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) // 設(shè)置圖片下載期間顯示的圖片.showImageForEmptyUri(R.drawable.ic_empty) // 設(shè)置圖片Uri為空或是錯誤的時候顯示的圖片.showImageOnFail(R.drawable.ic_error) // 設(shè)置圖片加載或解碼過程中發(fā)生錯誤顯示的圖片.cacheInMemory(true) // 設(shè)置下載的圖片是否緩存在內(nèi)存中.cacheOnDisk(true) // 設(shè)置下載的圖片是否緩存在SD卡中.displayer(new RoundedBitmapDisplayer(20)) // 設(shè)置成圓角圖片.build(); // 構(gòu)建完成mListImageLv.setAdapter(new ItemListAdapter());}@Overridepublic void addListener() {}class ItemListAdapter extends BaseAdapter {@Overridepublic int getCount() {return imageUrls.length;}@Overridepublic Object getItem(int position) {return imageUrls[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.item_list,null);viewHolder = new ViewHolder();viewHolder.image = (ImageView) convertView.findViewById(R.id.iv_image);viewHolder.text = (TextView) convertView.findViewById(R.id.tv_introduce);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}/*** imageUrl 圖片的Url地址 imageView 承載圖片的ImageView控件 options* DisplayImageOptions配置文件*/imageLoader.displayImage(imageUrls[position],viewHolder.image, options);viewHolder.text.setText("Item " + (position + 1)); // TextView設(shè)置文本return convertView;}public class ViewHolder {public ImageView image;public TextView text;}}}

    其中imageUrls 由以下MainActivity中的內(nèi)容發(fā)送而來

    // 點(diǎn)擊進(jìn)入ListView展示界面 public void onImageListClick(View view) { Intent intent = new Intent(this, ImageListActivity.class); intent.putExtra(Constants.IMAGES, Constants.images); startActivity(intent); }

    運(yùn)行效果

    c、GrideView實(shí)現(xiàn)加載圖片

    暫時空缺

    三、提示和技巧

    1、只有在你需要讓Image的尺寸比當(dāng)前設(shè)備的尺寸大的時候,你才需要配置maxImageWidthForMemoryCach(…)和

    maxImageHeightForMemoryCache(…)這兩個參數(shù),比如放大圖片的時候。其他情況下,不需要做這些配置,因?yàn)槟J(rèn)的配置會根據(jù)屏幕尺寸以最節(jié)約內(nèi)存的方式處理Bitmap。

    2、在設(shè)置中配置線程池的大小是非常明智的。一個大的線程池會允許多條線程同時工作,但是也會顯著的影響到UI線程的速度。但是可以通過設(shè)置一個較低的優(yōu)先級來解決:當(dāng)ImageLoader在使用的時候,可以降低它的優(yōu)先級,這樣UI線程會更加流暢。在使用List的時候,UI 線程經(jīng)常會不太流暢,所以在你的程序中最好設(shè)置threadPoolSize(…)和threadPriority(…)這兩個參數(shù)來優(yōu)化你的應(yīng)用。

    3、memoryCache(…)和memoryCacheSize(…)這兩個參數(shù)會互相覆蓋,所以在ImageLoaderConfiguration中使用一個就好了

    4、diskCacheSize(…)、diskCache(…)和diskCacheFileCount(…)這三個參數(shù)會互相覆蓋,只使用一個

    注:不要使用discCacheSize(…)、discCache(…)和discCacheFileCount(…)這三個參數(shù)已經(jīng)棄用

    5、如果你的程序中使用displayImage()方法時傳入的參數(shù)經(jīng)常是一樣的,那么一個合理的解決方法是,把這些選項(xiàng)

    配置在ImageLoader的設(shè)置中作為默認(rèn)的選項(xiàng)(通過調(diào)用defaultDisplayImageOptions(…)方法)。之后調(diào)用

    displayImage(…)方法的時候就不必再指定這些選項(xiàng)了,如果這些選項(xiàng)沒有明確的指定給

    defaultDisplayImageOptions(…)方法,那調(diào)用的時候?qū){(diào)用UIL的默認(rèn)設(shè)置。

    四、注意事項(xiàng)

    1、如果你經(jīng)常出現(xiàn)oom,你可以嘗試:

    1)禁用在內(nèi)存中緩存cacheInMemory(false),如果oom仍然發(fā)生那么似乎你的應(yīng)用程序有內(nèi)存泄漏,使用MemoryAnalyzer來檢測它。否則嘗試以下步驟(嘗試所有或幾個)

    2)減少配置的線程池的大小(.threadPoolSize(…)),建議1~5

    3)在顯示選項(xiàng)中使用 .bitmapConfig(Bitmap.Config.RGB_565) . RGB_565模式消耗的內(nèi)存比ARGB_8888模式少兩倍.

    4)配置中使用.diskCacheExtraOptions(480, 320, null)

    5)配置中使用 .memoryCache(newWeakMemoryCache()) 或者完全禁用在內(nèi)存中緩存(don’t call .cacheInMemory()).

    6)在顯示選項(xiàng)中使用.imageScaleType(ImageScaleType.EXACTLY) 或 .imageScaleType(ImageScaleType.IN_SAMPLE_INT)

    7)避免使用 RoundedBitmapDisplayer. 調(diào)用的時候它使用ARGB-8888模式創(chuàng)建了一個新的Bitmap對象來顯示,對于內(nèi)存緩存模式 (ImageLoaderConfiguration.memoryCache(…)) 你可以使用已經(jīng)實(shí)現(xiàn)好的方法.

    2、ImageLoader是根據(jù)ImageView的height,width確定圖片的寬高

    3、一定要對ImageLoaderConfiguration進(jìn)行初始化,否則會報錯

    4、開啟緩存后默認(rèn)會緩存到外置SD卡如下地址(/sdcard/Android/data/[package_name]/cache).如果外置SD卡不存在,會緩存到手機(jī). 緩存到Sd卡需要在AndroidManifest.xml文件中進(jìn)行如下配置

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

    5、內(nèi)存緩存模式可以使用以下已實(shí)現(xiàn)的方法 (ImageLoaderConfiguration.memoryCache(…))

    1)緩存只使用強(qiáng)引用

    LruMemoryCache (緩存大小超過指定值時,刪除最近最少使用的bitmap) –默認(rèn)情況下使用

    2)緩存使用弱引用和強(qiáng)引用

    UsingFreqLimitedMemoryCache (緩存大小超過指定值時,刪除最少使的bitmap)
    LRULimitedMemoryCache (緩存大小超過指定值時,刪除最近最少使用的bitmap) –默認(rèn)值
    FIFOLimitedMemoryCache (緩存大小超過指定值時,按先進(jìn)先出規(guī)則刪除的bitmap)
    LargestLimitedMemoryCache (緩存大小超過指定值時,刪除最大的bitmap)
    LimitedAgeMemoryCache (緩存對象超過定義的時間后刪除)
    3)緩存使用弱引用

    WeakMemoryCache(沒有限制緩存)

    6、本地緩存模式可以使用以下已實(shí)現(xiàn)的方法 (ImageLoaderConfiguration.diskCache(…))

    UnlimitedDiskCache 不限制緩存大小(默認(rèn))
    TotalSizeLimitedDiskCache (設(shè)置總緩存大小,超過時刪除最久之前的緩存)
    FileCountLimitedDiskCache (設(shè)置總緩存文件數(shù)量,當(dāng)?shù)竭_(dá)警戒值時,刪除最久之前的緩存。如果文件的大小都一樣的時候,可以使用該模式)
    LimitedAgeDiskCache (不限制緩存大小,但是設(shè)置緩存時間,到期后刪除)

    注意,使用ImageLoader之間一定要初始化,最簡單的方式就是在Application中加入

    ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomApplication.this));

    參考鏈接:

    Android開源框架Universal-Image-Loader詳解 - android

    Android UI-開源框架ImageLoader的完美例子 - 巫_1曲待續(xù) - 博客頻道 - CSDN.NET

    完成

    總結(jié)

    以上是生活随笔為你收集整理的ImageLoader实现图片异步加载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。