Andorid基於Glide v4版本封裝圖片加載工具類


Demo源碼請點擊

1.背景

一個app中的圖片加載類肯定是要封裝後再使用的。一方面調用方式統一,另外是稍加調整或更換圖片加載庫也方便。Android的圖片加載類庫有很多,目前主流的Glide用起來是相當絲滑的,本文是基於v4以後的版本的介紹。框架裏一般的使用方法,及常用方法,各位自行百度google,這裏介紹幾個我關注的知識點。另外進階級文章介紹Glide,我推薦鏈接:https://muyangmin.github.io/glide-docs-cn/doc/download-setup.html 。

2.封裝成果

2.1類源碼

public class ImageLoader {

    public static void displayImage(Context context, int res, ImageView imageView) {
        Glide.with(context).load(res).into(imageView);
    }

    public static void displayImage(Context context, int res, int placeholder, ImageView imageView) {
        Glide.with(context).load(res).placeholder(placeholder).into(imageView);
    }

    public static void displayImage(Context context, String url, ImageView imageView) {
        Glide.with(context).load(url).into(imageView);
    }

    public static void displayImage(Context context, String url, ImageView imageView, int width, int height) {
        Glide.with(context).load(url).override(width, height).centerCrop().into(imageView);
    }

    public static void displayImage(Context context, String url, int placeholder, ImageView imageView) {
        Glide.with(context).load(url).placeholder(placeholder).into(imageView);
    }

    public static void displayImage(Context context, String url, int placeholder, int errorRes, ImageView imageView) {
        Glide.with(context).load(url).placeholder(placeholder).error(errorRes).into(imageView);
    }

    public static void displayImage(Context context, String url, int placeholder, final ImageLoadCallback callback) {
        Glide.with(context).asBitmap().load(url).placeholder(placeholder).into(new CustomTarget<Bitmap>() {
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                HLogger.d("onResourceReady");
                callback.onResourceReady(resource);
            }

            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {

            }
        });
    }
}

以上封裝類是極簡單封裝,基本上滿足大部分應用場景了。Glide框架很多方法的默認配置,已經給我們做了優化。我的整個demo源碼已經放到GitHub上了。

2.2 調用

public void loadImage(View view) {
        ImageLoader.displayImage(MainActivity.this, picUrl, R.mipmap.ic_launcher_round, new ImageLoadCallback() {
            @Override
            public void onResourceReady(Bitmap bitmap) {
                HLogger.d("loadImage");
                imageView.setImageBitmap(bitmap);
            }
        });
//        ImageLoader.displayImage(MainActivity.this, picUrl, imageView, 400, 400);
    }

    public void loadGif(View view) {
        ImageLoader.displayImage(MainActivity.this, gifUrl, imageView);
    }

2.3使用介紹

相信大家都能看懂這個簡單的類的封裝,同時各位可以根據自己的需求自行增改符合自己的方法。有幾點我提一下:

  1. Context可以是fragment、activity、applicationContext。其實在Glide內,都獲取的是applicationContext。
  @GuardedBy("Glide.class")
  @SuppressWarnings("deprecation")
  private static void initializeGlide(
      @NonNull Context context,
      @NonNull GlideBuilder builder,
      @Nullable GeneratedAppGlideModule annotationGeneratedModule) {
      
    Context applicationContext = context.getApplicationContext();
    ...
    }
  1. override(int width, int height)方法,搭配ImageView ScaleType使用起來真實非常的爽歪歪。如果咱們的應用中有使用到列表展示圖片,且圖片控件的大小相對固定,我就非常建議使用這個方法,既能加快加載速度,又能一定程度上大大緩解OOM風險。
  2. 爲什麼我沒有修改緩存配置。因爲默認情況已經做的很好了。v4版本跟v3版本不同的是緩存策略也做了修改。
  • 默認情況下,Glide 會在開始一個新的圖片請求之前檢查以下多級的緩存:

1.活動資源 (Active Resources) - 現在是否有另一個 View 正在展示這張圖片?
2.內存緩存 (Memory cache) - 該圖片是否最近被加載過並仍存在於內存中?
3.資源類型(Resource) - 該圖片是否之前曾被解碼、轉換並寫入過磁盤緩存?
4.數據來源 (Data) - 構建這個圖片的資源是否之前曾被寫入過文件緩存?

前兩步檢查圖片是否在內存中,如果是則直接返回圖片。後兩步則檢查圖片是否在磁盤上,以便快速但異步地返回圖片。
如果四個步驟都未能找到圖片,則Glide會返回到原始資源以取回數據(原始文件,Uri, Url等)。

  • 緩存策略

DiskCacheStrategy.ALL 所有版本都會緩存
DiskCacheStrategy.NONE 所有版本都不緩存
DiskCacheStrategy.DATA 緩存解碼之前的原始信息
DiskCacheStrategy.RESOURCE 緩存解碼之後的數據信息
DiskCacheStrategy.AUTOMATIC 默認模式

默認的策略叫做 AUTOMATIC ,它會嘗試對本地和遠程圖片使用最佳的策略。當你加載遠程數據(比如,從URL下載)時,AUTOMATIC 策略僅會存儲未被你的加載過程修改過(比如,變換,裁剪–譯者注)的原始數據,因爲下載遠程數據相比調整磁盤上已經存在的數據要昂貴得多。對於本地數據,AUTOMATIC 策略則會僅存儲變換過的縮略圖,因爲即使你需要再次生成另一個尺寸或類型的圖片,取回原始數據也很容易。

自動模式意思就是對於遠程圖片,緩存未修改過的原始數據,以便後期基於緩存可以做任意改動。如果加載本地圖片,則緩存修改後的結果圖片,即使要基於本地原始圖片修改,也是相對方便滴。

  1. v3版本中的SimpleTarget不建議使用了,現在封裝了更多類型的Target。可以用CustomTarget代替以前的SimpleTarget。同時會重寫兩個方法onResourceReady和onLoadCleared,一般可以先忽略onLoadCleared。這個方法的意義是,如果確定在不需要展示獲取到的Bitmap resource時,可以調用Glide.with(fragment).clear(target);這句代碼告知glide,這個target資源或者Bitmap空間可以重用,或回收。

3.其他

  1. Glide有很多高級用法,比如你的項目工程比較龐大(用戶量及業務量),現有的方法策略等不足以滿足你的需求,需要基於它做更多的擴展和封裝,可以繼承自AppGlideModule類,做自己的GlideApp類封裝擴展。
  2. Glide同時也支持在圖片變換、過度動畫、緩存配置等等方面根據需求自定義配置,甚至定製使用自己的圖片下載ModelLoader。
  3. Glide採用引用計數法追蹤和重用資源。Glide 中的資源包含很多東西,例如 Bitmap,byte[] 數組, int[] 數組,以及大量的 POJO 。無論什麼時候,Glide 都會嘗試重用這些資源,以限制你應用中的內存抖動數量。

Demo源碼請點擊

發佈了39 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章