Android圖片緩存之初識Glide

Android圖片緩存之初識Glide

前言:

前面總結學習了圖片的使用以及Lru算法,今天來學習一下比較優秀的圖片緩存開源框架。技術本身就要不斷的更迭,從最初的自己使用SoftReference實現自己的圖片緩存,到后來做電商項目自己的實現方案不能滿足項目的需求改用Afinal,由于Afinal不再維護而選擇了師出同門的Xutils,中間也接觸過別的開源框架比如Picasso,對Picasso的第一次印象就不太好,初次接觸是拿到了公司剛從外包公司接手過來的圖片社交類app,對內存占用太大,直接感受就是導致ListView滑動有那么一點卡頓,老牌的圖片緩存框架universalImageLoader聽說過一直沒有真正使用過,之前項目都很小,差不多幾百萬級別的app,一直使用的都是Xutils,最近覺得項目大起來了,萬一Xutils不維護了或者說要求支持的圖片格式多起來的時候,可能Xutils就不是最佳選擇了,這也是來學習Gilde的根本動機吧。其實本來想著去學習Facebook的Fresco圖片框架,但是簡單的看了一下,需要連同自定義控件一起使用,功能雖然強大,但是對于已經在維護的項目修改成本那可不是一般的高,以后有興趣在學習吧!

圖片緩存相關博客地址:

Android圖片緩存之Bitmap詳解

Android圖片緩存之初識Glide

Android圖片緩存之Glide進階

Android圖片緩存之Lru算法

Glide簡介:

Glide 是 Google 員工的開源項目, Google I/O 上被推薦使用,一個高效、開源、Android設備上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議發布。Glide具有獲取、解碼和展示視頻劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者能夠將Glide應用在幾乎任何網絡協議棧里。創建Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果,另一個是支持遠程圖片的獲取、大小調整和展示。

gitHub地址:https://github.com/bumptech/glide

Glide特點

使用簡單

可配置度高,自適應程度高

支持常見圖片格式Jpg png gif webp

支持多種數據源網絡、本地、資源、Assets 等

高效緩存策略支持Memory和Disk圖片緩存 默認Bitmap格式采用RGB_565內存使用至少減少一半

生命周期集成根據Activity/Fragment生命周期自動管理請求

高效處理Bitmap使用Bitmap Pool使Bitmap復用,主動調用recycle回收需要回收的Bitmap,減小系統回收壓力

Glide簡單使用

1.)添加引用 build.gradle 中添加配置

compile 'com.github.bumptech.glide:glide:3.7.0'

2.)設置綁定生命周期

我們可以更加高效的使用Glide提供的方式進行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態管理起來

Glide.with(Context context);//綁定ContextGlide.with(Activity activity);//綁定ActivityGlide.with(FragmentActivity activity);//綁定FragmentActivityGlide.with(Fragment fragment);//綁定Fragment

3. )簡單的加載圖片實例

Glide.with(this).load(imageUrl).into(imageView);

4.)設置加載中以及加載失敗圖片

api里面對placeholder()、error()函數中有多態實現 用的時候可以具體的熟悉一下

Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

5.)設置跳過內存緩存

Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);

6.)設置下載優先級

Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);

7.)設置緩存策略

Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);

策略解說:

all:緩存源資源和轉換后的資源

none:不作任何磁盤緩存

source:緩存源資源

result:緩存轉換后的資源

8.)設置加載動畫

api也提供了幾個常用的動畫:比如crossFade()

Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);

R.anim.item_alpha_in

9.)設置縮略圖支持

這樣會先加載縮略圖 然后在加載全圖

Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);

10.)設置加載尺寸

Glide.with(this).load(imageUrl).override(800, 800).into(imageView);

11.)設置動態轉換

Glide.with(this).load(imageUrl).centerCrop().into(imageView);

api提供了比如:centerCrop()、fitCenter()等函數也可以通過自定義Transformation,舉例說明:比如一個人圓角轉化器

publicclassGlideRoundTransformextendsBitmapTransformation {privatefloatradius =0f;publicGlideRoundTransform(Context context) {this(context, 4);

}publicGlideRoundTransform(Context context,intdp) {super(context);this.radius = Resources.getSystem().getDisplayMetrics().density *dp;

}

@OverrideprotectedBitmap transform(BitmapPool pool, Bitmap toTransform,intoutWidth,intoutHeight) {returnroundCrop(pool, toTransform);

}privateBitmap roundCrop(BitmapPool pool, Bitmap source) {if(source ==null)returnnull;

Bitmap result=pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);if(result ==null) {

result=Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);

}

Canvas canvas=newCanvas(result);

Paint paint=newPaint();

paint.setShader(newBitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

paint.setAntiAlias(true);

RectF rectF=newRectF(0f, 0f, source.getWidth(), source.getHeight());

canvas.drawRoundRect(rectF, radius, radius, paint);returnresult;

}

@OverridepublicString getId() {returngetClass().getName() +Math.round(radius);

}

}

具體使用

Glide.with(this).load(imageUrl).transform(newGlideRoundTransform(this)).into(imageView);

12.)設置要加載的內容

項目中有很多需要先下載圖片然后再做一些合成的功能,比如項目中出現的圖文混排,該如何實現目標下

Glide.with(this).load(imageUrl).centerCrop().into(newSimpleTarget

() {

@OverridepublicvoidonResourceReady(GlideDrawable resource, GlideAnimationglideAnimation) {

imageView.setImageDrawable(resource);

}

});

13 .)設置監聽請求接口

Glide.with(this).load(imageUrl).listener(newRequestListener

() {

@OverridepublicbooleanonException(Exception e, String model, Target target,booleanisFirstResource) {returnfalse;

}

@OverridepublicbooleanonResourceReady(GlideDrawable resource, String model, Target target,booleanisFromMemoryCache,booleanisFirstResource) {//imageView.setImageDrawable(resource);returnfalse;

}

}).into(imageView);

設置監聽的用處 可以用于監控請求發生錯誤來源,以及圖片來源 是內存還是磁盤

15.)設置動態GIF加載方式

Glide.with(this).load(imageUrl).asBitmap().into(imageView);//顯示gif靜態圖片Glide.with(this).load(imageUrl).asGif().into(imageView);//顯示gif動態圖片

16.)緩存的動態清理

Glide.get(this).clearDiskCache();//清理磁盤緩存 需要在子線程中執行Glide.get(this).clearMemory();//清理內存緩存? 可以在UI主線程中進行

小結:

以上是Glide的常規用法,基本上滿足開發需要了,然后再去學習一下其他相關知識。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容