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的磁碟快取.