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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍

發(fā)布時(shí)間:2025/7/25 Android 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用簡(jiǎn)單介紹


一,前言:為什么要引入Android-Universal-Image-Loader?

眾所周知,簡(jiǎn)單的幾個(gè)ImageView載入幾個(gè)圖像資源、或者這幾個(gè)圖像資源是從本地載入時(shí)無(wú)需考慮過(guò)多直接載入就可以。但當(dāng)成千上百個(gè)ImageView載入成千上百個(gè)圖像、尤其是當(dāng)這些圖片還是從網(wǎng)絡(luò)中異步獲取,那么須要考慮的問(wèn)題細(xì)節(jié)非常多非常繁瑣且easy出錯(cuò)。如今隨便舉例當(dāng)中幾條:


(1)最主要的問(wèn)題,網(wǎng)絡(luò)不可靠。可能在不可靠網(wǎng)絡(luò)載入過(guò)程中。圖片載入發(fā)生難以預(yù)估的失敗。


(2)已經(jīng)從網(wǎng)絡(luò)或本地中載入成功的圖片,應(yīng)該避免反復(fù)載入,反復(fù)載入造成網(wǎng)絡(luò)流量浪費(fèi)。以及設(shè)備計(jì)算資源的反復(fù)浪費(fèi)。因此須要考慮圖片緩存策略。

緩存分為兩級(jí)緩存:第一級(jí):內(nèi)存緩存,第二級(jí):“硬盤(pán)”緩存(一般是手機(jī)的外置存儲(chǔ)如SD卡和內(nèi)置存儲(chǔ))。實(shí)現(xiàn)這種層級(jí)緩存策略須要自己維護(hù)和組織。

內(nèi)存緩存能夠考慮使用Android的LruCache。詳情參考我的另外兩篇文章:
a、《使用新式LruCache代替SoftReference緩存圖片,Android異步載入圖片》,文章鏈接地址:http://blog.csdn.net/zhangphil/article/details/43667415
b、或者自己依照LruCache設(shè)計(jì)思路實(shí)現(xiàn)和管理內(nèi)存管理,《基于Java LinkedList,實(shí)現(xiàn)Android大數(shù)據(jù)緩存策略》,文章鏈接地址:http://blog.csdn.net/zhangphil/article/details/44116885
硬盤(pán)緩存則要自己建立緩存索引和緩存文件結(jié)構(gòu)(怎樣建立緩存文件夾?內(nèi)存在何時(shí)機(jī)把硬盤(pán)緩存的圖片增加等等問(wèn)題)。


(3)設(shè)想這一種情況,在一個(gè)Android豎直方向上ListView中有成千上萬(wàn)條圖片item,每條item中的圖片均需從網(wǎng)絡(luò)獲取。

用戶(hù)手指在屏幕上高速滑動(dòng),滑動(dòng)過(guò)程中,極有可能可見(jiàn)視野內(nèi)的圖片還沒(méi)有載入完畢后,用戶(hù)已經(jīng)高速的往下滑看以下的圖片去了。

而上面已經(jīng)消失的圖片載入線程假設(shè)置之不理任由其運(yùn)作,那么,當(dāng)用戶(hù)在不斷的下拉和上拉過(guò)程中,將會(huì)造成線程不斷的重建和執(zhí)行,內(nèi)存開(kāi)銷(xiāo)極大。而對(duì)于用戶(hù)來(lái)來(lái),最緊迫的當(dāng)前可見(jiàn)視野的圖片載入顯示可能由于線程過(guò)多而被無(wú)限期遲延到最后顯示。

這樣的情況一般得應(yīng)對(duì)策略師自己維護(hù)和管理一個(gè)線程池(關(guān)于Java線程池。詳情請(qǐng)參考我的另外一篇文章:《Java線程池:ExecutorService。Executors》,文章鏈接地址:http://blog.csdn.net/zhangphil/article/details/43898637 )。自己管理和維護(hù)多線程下載任務(wù)隊(duì)列。顯然。須要考慮的線程隊(duì)列問(wèn)題非常多,非常繁瑣。

等等還有非常多未列舉出來(lái)的細(xì)節(jié)問(wèn)題。

為了避免反復(fù)造輪子,這樣的情況下最好考慮使用一些業(yè)界比較成熟穩(wěn)定的開(kāi)源框架。


Android ImageLoader(Android-Universal-Image-Loader),是github上的一個(gè)第三方開(kāi)源圖像載入庫(kù)。該項(xiàng)目在github上的鏈接地址:
https://github.com/nostra13/Android-Universal-Image-Loader?
Android-Universal-Image-Loader主要應(yīng)用領(lǐng)域是ImageView載入圖片。

該開(kāi)源框架對(duì)上述問(wèn)題給予了充分的解決。并提供了其它額外的附加功能(如載入的圖片尺寸。載入動(dòng)畫(huà)等等)。


二、Android-Universal-Image-Loader使用簡(jiǎn)單介紹。

首先到Android-Universal-Image-Loader官方網(wǎng)址下載項(xiàng)目包。使用能夠分為兩種方法
(1)把Android-Universal-Image-Loader的所有實(shí)現(xiàn)源碼(*.java)放入到自己的項(xiàng)目文件夾src下,當(dāng)作是自己的源碼使用。
(2)導(dǎo)入Android-Universal-Image-Loader的jar庫(kù)文件。比方universal-image-loader-1.9.4.jar。
兩種方式都能夠。看個(gè)人偏好。

我用的是第一種方法。這樣能夠方便查閱甚至直接二次定制改動(dòng)Android-Universal-Image-Loader的源碼為自己所用。
代碼結(jié)構(gòu)層次如圖:


然后就能夠直接使用,現(xiàn)給出一個(gè)演示樣例。


測(cè)試用的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";// 載入的數(shù)目。假定數(shù)據(jù)總量非常大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)// 線程數(shù)量.threadPriority(Thread.NORM_PRIORITY)// 線程優(yōu)先級(jí).tasksProcessingOrder(QueueProcessingType.FIFO).denyCacheImageMultipleSizesInMemory().memoryCacheSize(1024 * 1024 * 10) // 內(nèi)存緩存的容量10MB.diskCacheFileCount(100)// 緩存的文件數(shù)量.diskCacheSize(1024 * 1014 * 100)// 硬盤(pán)緩存的大小100MB.writeDebugLogs()// 輸出日志.build();return config;}private DisplayImageOptions getDisplayImageOptions() {DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.loading)// 載入過(guò)程中顯示的圖片.showImageForEmptyUri(R.drawable.ic_launcher)// 空URI顯示的圖片.showImageOnFail(R.drawable.error)// 載入失敗時(shí)候顯示內(nèi)容.cacheInMemory(true)// 緩存到內(nèi)存.cacheOnDisk(true)// 緩存到硬盤(pán).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能夠依據(jù)個(gè)人的須要選取不同的圖片資源。


ImageLoader在使用之前須要做一些初始化工作。配置ImageLoaderConfiguration和DisplayImageOptions 。

然后就能夠直接使用ImageLoader的displayImage()方法從網(wǎng)絡(luò)或本地存儲(chǔ)中異步載入圖片資源。而關(guān)于圖片資源的緩存和異步下載線程池隊(duì)列則交由ImageLoader為我們妥善在后臺(tái)管理好。

轉(zhuǎn)載于:https://www.cnblogs.com/zsychanpin/p/6949604.html

總結(jié)

以上是生活随笔為你收集整理的Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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