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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android Glide图片加载框架(二)源码解析之load()

發(fā)布時(shí)間:2023/12/13 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Glide图片加载框架(二)源码解析之load() 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、前言
  • 二、源碼分析
    • 1、load()


Android Glide圖片加載框架系列文章

Android Glide圖片加載框架(一)基本用法

Android Glide圖片加載框架(二)源碼解析之with()

Android Glide圖片加載框架(二)源碼解析之load()

Android Glide圖片加載框架(二)源碼解析之into()

Android Glide圖片加載框架(三)緩存機(jī)制


一、前言


在源碼分析系列文章中,上一篇我們分析了 Glide.with() 方法的用法及作用,它傳遞了我們的上下文對(duì)象,并且返回綁定了對(duì)應(yīng)生命周期的RequestManager對(duì)象,還沒有看過上一篇文章的朋友,建議先去閱讀 Android Glide圖片加載框架(二)源碼解析之with()。


下面我們來詳細(xì)分析 load() 方法的源碼。


二、源碼分析


1、load()


我們先來回顧下,平時(shí)在使用load方法的時(shí)候,可以傳入很多不同的參數(shù),例如:

Glide.with(this).load(R.drawable.ic_android).into(imageView); Glide.with(this).load("http://xxx.xxx.png").into(imageView); Glide.with(this).load(Uri.parse("xxxxx")).into(imageView); Glide.with(this).load(getResources().getDrawable(R.drawable.ic_android)).into(imageView); Glide.with(this).load(new File("xxx")).into(imageView); Glide.with(this).load(BitmapFactory.decodeFile("xxx")).into(imageView);

從上述代碼中我們可以看到有很多個(gè) load() 方法的重載,支持了多種形式的圖片資源,包括 本地圖片應(yīng)用資源網(wǎng)絡(luò)圖片二進(jìn)制流Uri對(duì)象 等,使用起來很方便,不用再自己寫一堆請求網(wǎng)絡(luò)或者讀取本地文件的騷操作,那么Glide的load()里面對(duì)它們做了什么處理,能夠兼容這么多形式的加載呢,讓我們一探究竟。

上一篇我們分析了 with() 方法的源碼,由于 with() 方法返回的是一個(gè) RequestManager 對(duì)象,那么很容易就能想到,load() 方法是在 RequestManager 類當(dāng)中的,所以說我們首先要看的就是 RequestManager 這個(gè)類。

RequestManager 類的簡化代碼(我們以load(String);為例)如下所示:

public class RequestManager implements LifecycleListener,ModelTypes<RequestBuilder<Drawable>> {...@NonNull@CheckResult@Overridepublic RequestBuilder<Drawable> load(@Nullable String string) {return asDrawable().load(string);}@NonNull@CheckResultpublic RequestBuilder<Drawable> asDrawable() {return as(Drawable.class);}@NonNull@CheckResultpublic <ResourceType> RequestBuilder<ResourceType> as(@NonNull Class<ResourceType> resourceClass) {return new RequestBuilder<>(glide, this, resourceClass, context);}... }

RequestManager 類的代碼是非常多的,但是經(jīng)過我這樣簡化之后,看上去就比較清爽了。在我們只探究加載圖片URL字符串這一個(gè)load()方法的情況下,那么比較重要的方法就只剩下上述代碼中的這三個(gè)方法。

那么我們先來看 load() 方法,這個(gè)方法中的邏輯是非常簡單的,只有一行代碼,就是先調(diào)用了 asDrawable() 方法,而 asDrawable() 方法也極為簡單,就是調(diào)用了 as() 方法,并且指定參數(shù)為 Drawable.class ,as()方法中初始化了一個(gè) RequestBuilder 對(duì)象,然后調(diào)用 RequestBuilder對(duì)象的load() 方法。

細(xì)心的朋友會(huì)發(fā)現(xiàn),Glide不止有 asDrawable() ,其實(shí)還有 asBitmap()asGif()asFile() 等等,如下:

public class RequestManager implements LifecycleListener,ModelTypes<RequestBuilder<Drawable>> {...public RequestBuilder<Bitmap> asBitmap() {return as(Bitmap.class).apply(DECODE_TYPE_BITMAP);}public RequestBuilder<GifDrawable> asGif() {return as(GifDrawable.class).apply(DECODE_TYPE_GIF);}public RequestBuilder<File> asFile() {return as(File.class).apply(skipMemoryCacheOf(true));}public <ResourceType> RequestBuilder<ResourceType> as(@NonNull Class<ResourceType> resourceClass) {return new RequestBuilder<>(glide, this, resourceClass, context);}... }

由此我們可以發(fā)現(xiàn),Glide默認(rèn)使用的是 asDrawable() ,不管是還有 asBitmap()asGif() 還是 asFile() 最終都調(diào)用 as() 方法返回 RequestBuilder 對(duì)象實(shí)例。

RequestBuilder類的簡化代碼如下所示:

public class RequestBuilder<TranscodeType> implements Cloneable,ModelTypes<RequestBuilder<TranscodeType>> {protected RequestBuilder(Glide glide, RequestManager requestManager,Class<TranscodeType> transcodeClass, Context context) {this.glide = glide;this.requestManager = requestManager;this.transcodeClass = transcodeClass;this.defaultRequestOptions = requestManager.getDefaultRequestOptions();this.context = context;this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass);this.requestOptions = defaultRequestOptions;this.glideContext = glide.getGlideContext();}@NonNull@Override@CheckResultpublic RequestBuilder<TranscodeType> load(@Nullable String string) {return loadGeneric(string);}@NonNullprivate RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {this.model = model;isModelSet = true;return this;} }

RequestBuilder 的構(gòu)造方法中我們可以看到,這里的 transcodeClass 就是我們剛傳進(jìn)來的Drawable類型,成為了 RequestBuilder 的成員變量。RequestBuilder對(duì)象實(shí)例化后,調(diào)用RequestBuilder的 load() 方法,load()方法內(nèi)部都是調(diào)用了 loadGeneric() ,這里的 model 即傳進(jìn)來的資源參數(shù)(例如String、Bitmap、File…),同樣賦給RequestBuilder的成員變量,并且置 isModelSet 標(biāo)志位為true,即標(biāo)志著設(shè)置完成的意思,并且將這個(gè)RequestBuilder實(shí)例返回。

至此我們得到了關(guān)于 RequestBuilder參數(shù) 的一些信息:

  • transcodeClass: 表示要將最終結(jié)果轉(zhuǎn)換為什么類型;

  • model: 表示傳進(jìn)來的資源參數(shù);

  • isModelSet: 是為了標(biāo)志你已經(jīng)調(diào)用了load方法,是一個(gè)必要條件,否則你沒有先設(shè)置你所要加載的資源,Glide怎么知道你要加載啥。

至此,Glide的 load() 完成了它的使命,是不是有種被欺騙的感覺,load()方法其實(shí)還沒真正開始加載,into()才是最終加載的地方




總結(jié)

以上是生活随笔為你收集整理的Android Glide图片加载框架(二)源码解析之load()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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