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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

你真的会使用Glide吗?——Glide的高级用法

發(fā)布時(shí)間:2025/3/18 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你真的会使用Glide吗?——Glide的高级用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天給大家分享一下Glide的一些使用技巧。Glide應(yīng)該是Android APP中使用最為廣泛的圖片加載框架了,如絲般的順滑滾動(dòng)以及方便的鏈?zhǔn)秸{(diào)用為廣大開發(fā)者所喜愛。但是開發(fā)中,我們總能遇上一些不太普遍的需求,比如列表中顯示視頻縮略圖、顯示音頻的封面圖、apk的圖標(biāo)等等,或者更奇葩的需求。這些場景使用框架默認(rèn)的調(diào)用無法滿足。

下面給大家分享一些處理以上需求的方法和技巧。

以下代碼中Glide使用的均為4.X版本。尤其是自定義加載部分,4.X版本較之前版本API有些許改動(dòng),請注意。

加載視頻縮略圖

對于視頻縮略圖的加載,Glide是自帶的,只是很多人并不知道,通過RequestOption可以進(jìn)行設(shè)置加載。如下代碼:

配置GlideModule用于生成GlideApp

@GlideModule public class MediaGlideModule extends AppGlideModule {@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {}} 復(fù)制代碼

然后使用GlideApp加載視頻縮略圖

GlideApp.with(context).setDefaultRequestOptions(new RequestOptions().frame(frameTimeMicros).centerCrop().error(defaultHolder).placeholder(defaultHolder)).load(path).into(view); 復(fù)制代碼

注意: 方法frame(long frameTimeMicros)需要指定你要獲取的時(shí)間點(diǎn),傳入的參數(shù)是微秒,如果要獲取2秒處的幀畫面即要傳入2000000.

Glide的自定義加載

上面給大家展示了如何使用Glide提供的API加載視頻縮略圖。但是如果我們想使用Glide去加載更加個(gè)性化的數(shù)據(jù)怎么做呢?比如在一個(gè)音樂列表里面要展示所有的音樂封面圖,Glide可沒提供這種API啊,咋整呢?這就需要用到Glide的自定義加載了。強(qiáng)大的Glide充分考慮到了用戶的個(gè)性化使用。你可以自定義數(shù)據(jù)流的獲取過程,然后回調(diào)給Glide就OK了,其他的什么任務(wù)的調(diào)度和分發(fā)以及緩存依舊是Glide幫你做,這塊無需關(guān)心。

Glide的自定義加載總結(jié)為以下過程:

  • 定義一個(gè)Model類用于包裝需要加載的數(shù)據(jù)
  • 定義一個(gè)Key的實(shí)現(xiàn)類,用于實(shí)現(xiàn)第一步的Model中的數(shù)據(jù)的簽名用于區(qū)分緩存
  • 定義一個(gè)DataFetcher的實(shí)現(xiàn)類,用于告訴Glide音頻封面如何加載,并把加載結(jié)果回調(diào)出去
  • 定義一個(gè)ModelLoader的實(shí)現(xiàn)類用于包裝DataFetcher
  • 定義一個(gè)ModelLoaderFactory的實(shí)現(xiàn)類用于生成ModelLoader實(shí)例
  • 將自定義加載配置到AppGlideModule中
  • 看著好像挺麻煩的,是吧。其實(shí)代碼沒多少,如下:

    • 第一步 定義一個(gè)包裝數(shù)據(jù)的Model類AudioCover
    public class AudioCover {final String path;public AudioCover(String path) {this.path = path;} } 復(fù)制代碼
    • 第二部 定義一個(gè)Key的實(shí)現(xiàn)類
    public class AudioCoverSignature implements Key {private final File file;private StringBuilder stringBuilder;public AudioCoverSignature(String path) {this.file = new File(path);stringBuilder = new StringBuilder();}@Override public void updateDiskCacheKey(MessageDigest messageDigest) {stringBuilder.append(file.lastModified()).append(file.getAbsolutePath());byte[] bs = stringBuilder.toString().getBytes();messageDigest.update(bs, 0, bs.length);} } 復(fù)制代碼
    • 第三部 定義一個(gè)DataFetcher的實(shí)現(xiàn)類(關(guān)鍵代碼-處理封面的獲取并回調(diào)給Glide)
    public class AudioCoverFetcher implements DataFetcher<InputStream> {private final AudioCover model;private MediaMetadataRetriever mRetriever;public AudioCoverFetcher(AudioCover model) {this.model = model;}public AudioCover getModel() {return model;}@Overridepublic void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {mRetriever = new MediaMetadataRetriever();try {mRetriever.setDataSource(model.path);byte[] picture = mRetriever.getEmbeddedPicture();if (picture != null) {callback.onDataReady(new ByteArrayInputStream(picture));} else {callback.onLoadFailed(new Exception("load audio cover fail"));}} catch (Exception e){e.printStackTrace();}}@Override public void cleanup() {mRetriever.release();}@Override public void cancel() {// cannot cancel}@NonNull@Overridepublic Class<InputStream> getDataClass() {return InputStream.class;}@NonNull@Overridepublic DataSource getDataSource() {return DataSource.LOCAL;} } 復(fù)制代碼

    注意: 方法loadData()是同步的方法,直接處理獲取即可。

    • 第四部 定義一個(gè)ModelLoader的實(shí)現(xiàn)類包裝DataFetcher
    public class AudioModuleLoader implements ModelLoader<AudioCover, InputStream> {@Nullable@Overridepublic LoadData<InputStream> buildLoadData(@NonNull AudioCover audioCover, int width, int height, @NonNull Options options) {return new LoadData<>(new AudioCoverSignature(audioCover.path), new AudioCoverFetcher(audioCover));}@Overridepublic boolean handles(@NonNull AudioCover audioCover) {return true;} } 復(fù)制代碼
    • 第五步 定義一個(gè)ModelLoaderFactory的實(shí)現(xiàn)類用于生成ModelLoader的實(shí)例
    public class AudioCoverLoaderFactory implements ModelLoaderFactory<AudioCover,InputStream> {@NonNull@Overridepublic ModelLoader<AudioCover, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {return new AudioModuleLoader();}@Overridepublic void teardown() {} } 復(fù)制代碼
    • 第六步 將自定義加載配置到GlideModule中
    @GlideModule public class MediaGlideModule extends AppGlideModule {@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {super.registerComponents(context, glide, registry);registry.append(AudioCover.class,InputStream.class,new AudioCoverLoaderFactory());}} 復(fù)制代碼

    然后就可以愉快的使用了

    GlideApp.with(context)//使用Model類包裝數(shù)據(jù)即可.load(new AudioCover(path)).placeholder(defaultHolder).error(defaultHolder).into(view); 復(fù)制代碼

    通過Glide的自定義加載可以實(shí)現(xiàn)很多Glide之外的數(shù)據(jù)流加載,加載部分給了充分的自由度,比如你還可以自定義一個(gè)用于獲取apk圖標(biāo)加載,又或者你可以在加載時(shí)請求某些數(shù)據(jù)接口而實(shí)現(xiàn)更為復(fù)雜的加載過程等等。

    以上就是Glide的自定義加載使用,有需要的可以參考一下。

    與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的你真的会使用Glide吗?——Glide的高级用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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