欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android App中使用Glide加載圖片的教程

 更新時(shí)間:2016年04月27日 15:46:26   作者:傾城_之淚  
這篇文章主要介紹了Android App中使用Glide加載圖片的教程,包括網(wǎng)絡(luò)和本地圖片的加載方法講解,以及圖片加載異常的調(diào)試辦法,需要的朋友可以參考下

與其他圖片加載庫(kù)相同,Glide除了可以加載網(wǎng)絡(luò)圖片之外,也可以加載本地圖片。甚至還可以從各種各樣奇葩的數(shù)據(jù)源中加載圖片。

加載網(wǎng)絡(luò)圖片
很多情況下,我們使用圖片加載庫(kù)就是為了加載網(wǎng)絡(luò)圖片。網(wǎng)絡(luò)操作是一個(gè)很復(fù)雜的東西。試想一下,如果沒(méi)有圖片加載庫(kù),我們就要手動(dòng)去下載圖片,緩存圖片,最后再?gòu)奈募锩孀x取bitmap并設(shè)置到Imageview里面。這還算好的,要是在Listview里面你會(huì)更頭疼的。原因我就不說(shuō)了,你懂的~~再加上各種各樣的Bitmap操作,保準(zhǔn)你再也不想擼代碼了。而且Bitmap這東西還很占內(nèi)存,伺候不好,很容易就會(huì)引發(fā)OOM,app吧唧就閃退了!!

圖片加載庫(kù)的優(yōu)勢(shì)就在于此。簡(jiǎn)簡(jiǎn)單單一句話(huà),下載,緩存,加載統(tǒng)統(tǒng)搞定。簡(jiǎn)直就是美好一生的東西。而Glide就是這樣使人美好一生的東西之一。

說(shuō)了這么多,Glide如何加載網(wǎng)絡(luò)圖片?很簡(jiǎn)單,就上次的三句話(huà):

ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
String internetUrl = "http://i.imgur.com/idojSYm.png";
Glide
  .with(context)
  .load(internetUrl)
  .into(targetImageView);

木有什么亂七八糟的東西,直接傳入要加載圖片的url就可以了。那么圖片加載庫(kù)有很多,為什么選擇Glide呢?很簡(jiǎn)單,因?yàn)樗鲿常豢?,尤其是在Listview中。嗯,就是醬~

加載本地圖片
下表是.load()可以傳入的參數(shù)及說(shuō)明

參數(shù) 說(shuō)明
.load(String string) string可以為一個(gè)文件路徑、uri或者url
.load(Uri uri) uri類(lèi)型
.load(File file) 文件
.load(Integer resourceId) 資源Id,R.drawable.xxx或者R.mipmap.xxx
.load(byte[] model) byte[]類(lèi)型
.load(T model) 自定義類(lèi)型

從上面可以看到Glide不僅可以加載網(wǎng)絡(luò)圖片,還可以加載本地圖片??山邮艿膮?shù)有文件路徑,uri,文件,資源id等。基本上滿(mǎn)足了大部分的需求。雖然加載本地圖片不像網(wǎng)絡(luò)圖片那樣復(fù)雜,但我還是建議使用Glide來(lái)加載本地圖片。因?yàn)樗莾?nèi)存友好的,而且還會(huì)“偷偷地”幫我們做很多事情。比如內(nèi)存緩存,Bitmap復(fù)用,修正照片方向等。當(dāng)然為了滿(mǎn)足各種各樣的需求,僅僅加載圖片是不夠的,你還需要對(duì)圖片進(jìn)行各種各樣的變換,也就是Transformation。后面我們會(huì)詳細(xì)了解的。

加載自定義數(shù)據(jù)源
前面的表格中有一個(gè)是我們不熟悉的,就是.load(T model),即自定義的數(shù)據(jù)源類(lèi)型。那么如何去實(shí)現(xiàn)呢?

實(shí)際上,加載自定義數(shù)據(jù)源主要是通過(guò)ModelLoader接口來(lái)實(shí)現(xiàn)的。由于沒(méi)有在實(shí)際項(xiàng)目中用到過(guò),這方面的經(jīng)驗(yàn)比較少。

不過(guò)從官方Wiki上來(lái)看,設(shè)計(jì)ModelLoader接口的初衷用來(lái)加載不同尺寸的圖片的。眾所周知,Android設(shè)備屏幕分辨率千奇百怪,大到2K,小到320p。如果在低分辨率的手機(jī)上加載大圖,不僅損耗用戶(hù)流量,而且很容易造成OOM;在高分辨的手機(jī)上,加載小圖又會(huì)出現(xiàn)模糊的情況,用戶(hù)體驗(yàn)極差。很多時(shí)候,為了省事,很多app都會(huì)選擇一個(gè)中間分辨率,然后自適應(yīng)大小。當(dāng)然這樣做無(wú)可厚非,但是有更好的辦法,我們?yōu)槭裁床蝗L試呢?

那么如何使用Glide來(lái)實(shí)現(xiàn)這一具體需求呢?首先你要實(shí)現(xiàn)自己的ModelLoader,比較簡(jiǎn)單的方法是繼承BaseGlideUrlLoader。

public interface MyDataModel {
  public String buildUrl(int width, int height);
} 
public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> {
  @Override
  protected String getUrl(MyDataModel model, int width, int height) {
    // Construct the url for the correct size here.
    return model.buildUrl(width, height);
  }
}

接下來(lái)我們可以這樣來(lái)加載圖片:

Glide.with(this)
   .using(new MyUrlLoader(this))
   .load(new MyDataModel() {
     @Override
     public String buidUrl(int width, int height) {
       if (width >= 600) {
         return url1;
       } else {
         return url2;
        }
     }
   })
   .into(imageView);

(1).using(new MyUrlLoader(this)):使用我們自己的ModeLoader;
(2).load(new MyDataModel()):加載我們自定義的數(shù)據(jù)源

這里需要解釋下getUrl的三個(gè)參數(shù):
(1)model:你加載的數(shù)據(jù)源
(2)width:你加載的圖片的寬度(px)
(3)height:你加載的圖片的高度(px)

這樣,我們?cè)诟叻致实脑O(shè)備上加載大圖的url1,在低分辨率的設(shè)備上加載小圖url2。從而實(shí)現(xiàn)了根據(jù)不同手機(jī)上的像素值大小加載不同尺寸的圖片的需求。

當(dāng)然如果你不想每次都是用.using(new MyUrlLoader()),就需要實(shí)現(xiàn)一個(gè)自定義的ModelLoaderFactory并在GlideModule中注冊(cè)。

public class MyGlideModule implements GlideModule {
  ...
  @Override
  public void registerComponents(Context context, Glide glide) {
    glide.register(MyDataModel.class, InputStream.class, 
      new MyUrlLoader.Factory());
  }
}

同時(shí)也要在AndroidManifest.xml聲明

<meta-data
  android:name="com.mypackage.MyGlideModule"
  android:value="GlideModule" />

如果你有多個(gè)自定義的GlideModule類(lèi),那么也要在AndroidManifest.xml中聲明多個(gè)GlideModule。

在服務(wù)端有下面的幾個(gè)可以加載的url:

URL 圖片大小
myserver.com/images/__w-200-400-600-800-1000__/session1.jpg 原始尺寸
myserver.com/images/w200/session1.jpg 200px
myserver.com/images/w400/session1.jpg 400px
myserver.com/images/w600/session1.jpg 600px
myserver.com/images/w800/session1.jpg 800px
myserver.com/images/w1000/session1.jpg 1000px

那么客戶(hù)端如何根據(jù)不同的手機(jī)分辨率去加載不同的url呢?

Google是這樣做的,下面是核心代碼:

//定義正則表達(dá)式
private static final Pattern PATTERN =
   Pattern.compile("__w-((?:-?\\d+)+)__");

@Override
protected String getUrl(String model, int width, int height) {
  Matcher m = PATTERN.matcher(model);
  int bestBucket = 0;
  if (m.find()) {
    String[] found = m.group(1).split("-");//拿到可以加載的尺寸數(shù)組
    for (String bucketStr : found) {
      bestBucket = Integer.parseInt(bucketStr);
      if (bestBucket >= width) {//剛好大于要加載的尺寸,直接跳出循環(huán)
        // the best bucket is the first immediately
        // bigger than the requested width
        break;
      }
    }
    if (bestBucket > 0) {//返回合適尺寸的url
      model = m.replaceFirst("w"+bestBucket);
    }
  }
  return model;
}

大概的步驟如下:
1.根據(jù)服務(wù)端可加載的圖片url定義正則表達(dá)式
2.根據(jù)正則匹配,獲取到可以加載的圖片尺寸數(shù)組
3.根據(jù)要加載的Imageview的大小,選擇合適的尺寸的url
4.拼接url并返回

上面的例子中有200,400,600,800,1000是可以加載的,如果你要加載的Imageview的大小為600px,當(dāng)遍歷數(shù)組到600時(shí),就會(huì)直接跳出循環(huán),返回600px大小圖片的url,Glide就會(huì)加載600px的圖片。

異常調(diào)試
在Glide加載圖片過(guò)程中出現(xiàn)異常時(shí),默認(rèn)是沒(méi)有l(wèi)og輸出的。但是Glide給開(kāi)發(fā)者提供了兩種方法來(lái)查看或者響應(yīng)這些異常。
1.調(diào)試
為了在異常發(fā)生時(shí)可以看到它們,你可以打開(kāi)Glide中處理所有媒體加載響應(yīng)的類(lèi)GenericRequest的log開(kāi)關(guān)。很簡(jiǎn)單,在命令行運(yùn)行下面的指令即可:

adb shell setprop log.tag.GenericRequest DEBUG

如果你將DEBUG替換為VERBOSE,還可以看到詳細(xì)的請(qǐng)求時(shí)間日志。
如果你想禁用log輸出,執(zhí)行:

adb shell setprop log.tag.GenericRequest ERROR

2.調(diào)試工作流

2016427154541538.jpg (550×181)

為了查看Glide內(nèi)部引擎是何時(shí)、如何加載圖片的,你可以啟用這些log:

adb shell setprop log.tag.Engine VERBOSE
adb shell setprop log.tag.EngineJob VERBOSE
adb shell setprop log.tag.DecodeJob VERBOSE

啟用這些log可以幫助你了解到為什么某些資源沒(méi)有從內(nèi)存中加載?為什么從外部url加載要重新下載數(shù)據(jù)?同時(shí)這也有助于了解在磁盤(pán)緩存時(shí)哪些參數(shù)需要配置。啟用DecodeJob log還可以幫助你了解自定義變換/解碼器/編碼器等相關(guān)問(wèn)題。
3.請(qǐng)求監(jiān)聽(tīng)器
雖然啟動(dòng)調(diào)試日志很簡(jiǎn)單,但前提是你可以訪問(wèn)到設(shè)備。為了完善Glide已存在或更復(fù)雜的錯(cuò)誤日志系統(tǒng),你可以使用RequestListener類(lèi)。當(dāng)加載請(qǐng)求失敗時(shí)onException()方法就會(huì)被調(diào)用,并給出造成失敗的異?;蛘遪ull(在解碼器無(wú)法從它獲取到的數(shù)據(jù)中解碼出任何有用的東西時(shí))。你可以通過(guò)listener() API為每一個(gè)請(qǐng)求添加一個(gè)監(jiān)聽(tīng)器。
確保onException()方法的返回值為false,避免覆蓋Glide默認(rèn)的錯(cuò)誤處理(比如加載失敗的錯(cuò)誤圖片占位)。
這里有一個(gè)實(shí)現(xiàn)快速調(diào)試的列子:

// 示例: .listener(new LoggingListener<String, GlideDrawable>()) 
public class LoggingListener<T, R> implements RequestListener<T, R> {
  @Override public boolean onException(Exception e, Object model, Target target, boolean isFirstResource) {
    android.util.Log.d("GLIDE", String.format(Locale.ROOT,
        "onException(%s, %s, %s, %s)", e, model, target, isFirstResource), e);
    return false; 
  } 
  @Override public boolean onResourceReady(Object resource, Object model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
    android.util.Log.d("GLIDE", String.format(Locale.ROOT,
        "onResourceReady(%s, %s, %s, %s, %s)", resource, model, target, isFromMemoryCache, isFirstResource));
    return false; 
  } 
}

相關(guān)文章

  • Android仿微信布局的實(shí)現(xiàn)示例

    Android仿微信布局的實(shí)現(xiàn)示例

    本文主要介紹了Android仿微信布局的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • flutter中的資源和圖片加載示例詳解

    flutter中的資源和圖片加載示例詳解

    這篇文章主要為大家介紹了flutter中的資源和圖片加載示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包

    Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包

    這篇文章主要介紹了Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包,本文講解了導(dǎo)入Android Studio、Gradle常用命令等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • Android開(kāi)發(fā) -- 狀態(tài)欄通知Notification、NotificationManager詳解

    Android開(kāi)發(fā) -- 狀態(tài)欄通知Notification、NotificationManager詳解

    本文主要講解狀態(tài)欄通知Notification、NotificationManager,小編覺(jué)得非常詳細(xì),給大家一個(gè)參考,希望對(duì)大家學(xué)習(xí)有所幫助。
    2016-06-06
  • Kotlin淺析null操作方法

    Kotlin淺析null操作方法

    Kotlin對(duì)比于Java的一個(gè)最大的區(qū)別就是它致力于消除空引用所帶來(lái)的危險(xiǎn)。在Java中,如果我們嘗試訪問(wèn)一個(gè)空引用的成員可能就會(huì)導(dǎo)致空指針異常NullPointerException(NPE)的出現(xiàn)。在Kotlin語(yǔ)言中就解決了這個(gè)問(wèn)題,下面來(lái)看看它是如何做到的
    2022-08-08
  • 圖文詳解Android屬性動(dòng)畫(huà)

    圖文詳解Android屬性動(dòng)畫(huà)

    這篇文章主要以圖文結(jié)合的方式詳細(xì)介紹了Android屬性動(dòng)畫(huà),本文主要講解如何使用屬性動(dòng)畫(huà),需要的朋友可以參考下
    2015-12-12
  • Android快速分析apk工具aapt的使用教程

    Android快速分析apk工具aapt的使用教程

    這篇文章主要介紹了Android快速分析apk工具aapt的使用教程,本文講解了什么是aapt、主要用法、使用aapt、查看apk的基本信息、查看基本信息、查看應(yīng)用權(quán)限等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Android長(zhǎng)按imageview把圖片保存到本地的實(shí)例代碼

    Android長(zhǎng)按imageview把圖片保存到本地的實(shí)例代碼

    本文通過(guò)代碼給大家介紹了Android長(zhǎng)按imageview把圖片保存到本地的實(shí)現(xiàn)方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-12-12
  • Android 自定義View實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條功能

    Android 自定義View實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條功能

    這篇文章主要介紹了Android 自定義View實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 淺談Android的Lifecycle源碼分析

    淺談Android的Lifecycle源碼分析

    這篇文章主要介紹了淺談Android的Lifecycle源碼分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論