1. 程式人生 > >android Glide 獲取磁碟快取

android Glide 獲取磁碟快取

Glide是Google推薦的圖片載入庫, 載入圖片一般以下面的形式:

Glide.with(context).load(ImgUrl)
      .asBitmap()
      .error(R.drawable.error)
      .placeholder(R.drawable.loading)
      .dontAnimate()
      .diskCacheStrategy(DiskCacheStrategy.ALL)
      .into(ImageView);

load物件: String(檔案路徑,網路地址),File(檔案資源),Integer(資源id);
asGif:表示的gif動畫,asBitmap:表示靜態圖
diskCacheStrategy磁碟快取策略:
(1). DiskCacheStrategy.RESULT:展示小大的圖片快取
(2). DiskCacheStrategy.ALL; 展示在控制元件中大小圖片尺寸和原圖都會快取
(3). DiskCacheStrategy.NONE:不設定快取
(4). DiskCacheStrategy.SOURCE:原圖快取

placeholder(R.drawable.loading): 目標從載入到展示時的控制元件的顯示狀態(多用網路載入動畫)
error(R,drawable,error): 載入失敗時,控制元件顯示的圖片。
into(ImageView): 展示的控制元件

Glide載入網路圖片時, 會將圖片快取一份到本地, 下次再載入的時候優先從快取中拿取, 提高速度.

如果想獲取Glide快取的圖片, 怎麼辦?
我們都知道 開源框架Universal_Image_Loader 提供 “getDiskCache().get(url)” 去獲取圖片的本地快取.
但是Glide並沒有提供類似方法.

那麼Glide如何獲取本地的快取 ?
Glide提供 downloadOnly() 介面, 可以通過此介面來獲取快取檔案. 但是有一個前提:
使用Glide載入圖片時, 必須指定diskCacheStrategy磁碟快取策略為DiskCacheStrategy.ALL 或 DiskCacheStrategy.SOURCE

使用downloadOnly()獲取快取檔案(此方法需要線上程中執行, 如果確定檔案有快取, 它會從快取中讀取檔案, 很快):

private class GetImageCacheTask extends AsyncTask<String, Void, File
> {
private final Context context; public SaveImageTask(Context context) { this.context = context; } @Override protected File doInBackground(String... params) { String imgUrl = params[0]; try { return Glide.with(context) .load(imgUrl) .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .get(); } catch (Exception ex) { return null; } } @Override protected void onPostExecute(File result) { if (result == null) { return; } //此path就是對應檔案的快取路徑 String path = result.getPath(); //將快取檔案copy, 命名為圖片格式檔案 copyFile(path, newPath); } }

上面的path就是對應圖片的快取地址, 類似於: /data/data/包名/cache/image_manager_disk_cache/6872faf4075a6461f3d7ceb2e5ff625beeaae67d3b7e44a0d1e3cd332aa471dc.0

Glide對檔案快取時, 採用SHA-256加密演算法, 所以如果需要獲得圖片, 需要將獲得的檔案copy一份, 命名為圖片格式的檔案.
對應程式碼:

    /**
    * oldPath: 圖片快取的路徑
    * newPath: 圖片快取copy的路徑
    */
    public static void copyFile(String oldPath, String newPath) {
        try {
            int byteRead;
            File oldFile = new File(oldPath);
            if (oldFile.exists()) {
                InputStream inStream = new FileInputStream(oldPath);
                FileOutputStream fs = new FileOutputStream(newPath);
                byte[] buffer = new byte[1024];
                while ( (byteRead = inStream.read(buffer)) != -1) {
                    fs.write(buffer, 0, byteRead);
                }
                inStream.close();
            }
        }
        catch (Exception e) {
            System.out.println("複製檔案操作出錯");
            e.printStackTrace();
        }
    }

這樣就會在新的路徑下生成所需要的圖片檔案. 通過這種方式就可以獲取Glide的磁碟快取.