圖片加載功能封裝----基于UIL庫的封裝

相信做過一兩年android開發(fā)的程序員玩焰,應(yīng)該都使用過UIL庫(Universal-Image-Loader),這是一個(gè)強(qiáng)大的圖片加載庫,支持各種配置篷店,但是這些常用配置往往對(duì)于不用的項(xiàng)目,也幾乎大同小異臭家,本著代碼復(fù)用疲陕,高效開發(fā)業(yè)務(wù)代碼的原則,本文就來基于UIL庫钉赁,做一個(gè)簡(jiǎn)單的封裝蹄殃。


  • 首先新建一個(gè)Android Library的module,便于多個(gè)項(xiàng)目共享你踩,然后在這個(gè)module的build.gradle中加入對(duì)UIL庫的依賴:
dependencies {
    ...
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
}

當(dāng)然重要的兩個(gè)權(quán)限也別忘記了:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 然后新建一個(gè)類ImageLoaderManager
/**
 * @author Jerry
 * 圖片加載管理诅岩,基于UIL庫
 */
public class ImageLoaderManager {
    // 同時(shí)最大的圖片線程加載數(shù)
    public static final int THEAD_COUNT = 5;
    // 圖片加載優(yōu)先級(jí)
    public static final int PRIORITY = 5;
    // 磁盤緩存大小讳苦,50M
    public static final int DISK_CACHE_SIZE = 50 * 1024 * 1024;
    // 圖片加載連接超時(shí)
    public static final int CONNECT_TIME_OUT = 5 * 1000;
    // 圖片加載IO讀取超時(shí)
    public static final int READ_TIME_OUT = 5 * 1000;

    private static ImageLoader sImageLoader = null;
    private static ImageLoaderManager sInstance = null;

    /**
     * double check,單例
     * @return 實(shí)例對(duì)象
     */
    public static ImageLoaderManager getInstance(Context context) {
        if (sInstance == null){
            synchronized (ImageLoaderManager.class){
                if (sInstance == null){
                    sInstance = new ImageLoaderManager(context.getApplicationContext());
                }
            }
        }
        return sInstance;
    }

    private ImageLoaderManager(Context context) {
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .threadPoolSize(THEAD_COUNT)    // 加載圖片線程池中最大的線程數(shù)
                .threadPriority(Thread.NORM_PRIORITY - PRIORITY) // 針對(duì)不同安卓系統(tǒng)的線程優(yōu)先級(jí)的適配吩谦,加載圖片的線程優(yōu)先級(jí)
                .denyCacheImageMultipleSizesInMemory()  // 防止加載器緩存多套不同的尺寸到內(nèi)存中
                .memoryCache(new WeakMemoryCache()) // 使用弱引用鸳谜,在系統(tǒng)內(nèi)存不足時(shí)回收?qǐng)D片資源
                .diskCacheSize(DISK_CACHE_SIZE) // 磁盤緩存大小
                .diskCacheFileNameGenerator(new Md5FileNameGenerator()) // 使用md5來命名緩存的磁盤圖片文件
                .tasksProcessingOrder(QueueProcessingType.LIFO) // 圖片加載下載的順序,后進(jìn)先出算法
                .defaultDisplayImageOptions(getDefaultDisplayOptions()) // 默認(rèn)的圖片顯示配置器
                .imageDownloader(new BaseImageDownloader(context,
                        CONNECT_TIME_OUT, READ_TIME_OUT))   // 設(shè)置圖片下載器
                .writeDebugLogs()   // debug模式下打印出日志
                .build();
        sImageLoader = ImageLoader.getInstance();
        sImageLoader.init(config);
    }

    private DisplayImageOptions getDefaultDisplayOptions() {
        return new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.jsdk_img_error)    // 圖片加載地址為空的時(shí)候顯示的圖片
                .showImageOnFail(R.drawable.jsdk_img_error)         // 圖片加載失敗的時(shí)候顯示的圖片
                .cacheInMemory(true)                                // 設(shè)置圖片可以緩存到內(nèi)存
                .cacheOnDisk(true)                                  // 設(shè)置圖片可以緩存到磁盤
                .bitmapConfig(Bitmap.Config.ARGB_4444)              // 設(shè)置圖片顯示的渲染色彩的質(zhì)量式廷,減小圖片占用內(nèi)存
                .decodingOptions(new BitmapFactory.Options())       // 使用系統(tǒng)默認(rèn)的解碼配置
                .build();
    }

    public void showImage(ImageView imageView, String url){
        showImage(imageView, url, null);
    }

    public void showImage(ImageView imageView, String url, ImageLoadingListener loadingListener){
        showImage(imageView, url, null, loadingListener);
    }

    /**
     * 加載顯示圖片
     * @param imageView         圖片控件
     * @param url               圖片地址
     * @param opts              顯示配置
     * @param listener          加載監(jiān)聽回調(diào)
     */
    public void showImage(ImageView imageView, String url, DisplayImageOptions opts,
                          ImageLoadingListener listener){
        if (sImageLoader != null) {
            sImageLoader.displayImage(url, imageView, opts, listener);
        }
    }
}

源碼的注釋寫的很清楚咐扭,至于為什么這么配置圖片加載器對(duì)象和顯示對(duì)象,這是根據(jù)項(xiàng)目中使用的經(jīng)營(yíng)總結(jié)的滑废。
使用也很簡(jiǎn)單蝗肪,當(dāng)然也可以自定義自己的加載器配置和圖形顯示配置,同時(shí)也可以監(jiān)聽圖形加載情況:

ImageLoaderManager.getInstance(Activity.實(shí)例對(duì)象)
          .showImage(ivHeaderImage, "http://www.jkfds.com/jrweosdfjk.jpg")

一個(gè)簡(jiǎn)單的封裝蠕趁,UIL庫源碼還是值得多分析的穗慕,里面有很多設(shè)計(jì)思想,最簡(jiǎn)單的比如圖片加載器對(duì)象的DCL妻导,雙檢查單例(這邊在有些情況下IPC多進(jìn)程的應(yīng)用場(chǎng)景需要注意下逛绵,單例失效的問題)圖片加載器配置和圖片顯示配置,對(duì)于這樣需要設(shè)置很多配置信息內(nèi)容屬性的倔韭,可以用構(gòu)建者模式术浪,靈活優(yōu)雅。還可以學(xué)習(xí)到圖片加載的三級(jí)緩存機(jī)制寿酌,以及圖片任務(wù)下載多線程線程池任務(wù)隊(duì)列的處理等等胰苏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市醇疼,隨后出現(xiàn)的幾起案子硕并,更是在濱河造成了極大的恐慌,老刑警劉巖秧荆,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倔毙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乙濒,警方通過查閱死者的電腦和手機(jī)陕赃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颁股,“玉大人么库,你說我怎么就攤上這事「视校” “怎么了诉儒?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亏掀。 經(jīng)常有香客問我忱反,道長(zhǎng)运准,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任缭受,我火速辦了婚禮,結(jié)果婚禮上该互,老公的妹妹穿的比我還像新娘米者。我一直安慰自己,他們只是感情好宇智,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布蔓搞。 她就那樣靜靜地躺著,像睡著了一般随橘。 火紅的嫁衣襯著肌膚如雪喂分。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天机蔗,我揣著相機(jī)與錄音蒲祈,去河邊找鬼。 笑死萝嘁,一個(gè)胖子當(dāng)著我的面吹牛梆掸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牙言,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼酸钦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了咱枉?” 一聲冷哼從身側(cè)響起卑硫,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚕断,沒想到半個(gè)月后欢伏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亿乳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年颜懊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片风皿。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡河爹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桐款,到底是詐尸還是另有隱情咸这,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布魔眨,位于F島的核電站媳维,受9級(jí)特大地震影響酿雪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侄刽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一指黎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧州丹,春花似錦醋安、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至所计,卻和暖如春柠辞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背主胧。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工叭首, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踪栋。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓放棒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親己英。 傳聞我的和親對(duì)象是個(gè)殘疾皇子间螟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容