前言
近期研究了一下Glide的圖片加載框架,在這里和大家分享一下。由于代碼研讀有限,難免有錯誤的地方,了解的童鞋還望指正。學習小組QQ群: 193765960。
本篇是Glide框架及源碼解析的第五篇,主要是總結記錄Glide的一些使用技巧(會持續更新)。如果這篇文章對大家學習Glide有幫助,還望大家多多轉載。
版權歸作者所有,如有轉發,請注明文章出處:http://www.lxweimin.com/u/d43d948bef39
相關文章:
跟著源碼學設計:Glide框架及源碼解析(一)
跟著源碼學設計:Glide框架及源碼解析(二)
跟著源碼學設計:Glide框架及源碼解析(三)
跟著源碼學設計:Glide框架及源碼解析(四)
跟著源碼學設計:Glide框架及源碼解析(五)
Glide使用詳解(一)
顯示拍照或者相冊中的照片:Uri
Glide.with(this).load(uri).into(im_car_pic);
將資源轉換成base64數據
import android.util.Base64;
......
Glide.with(this).load(datastr).asBitmap().toBytes().into(new SimpleTarget<byte[]>(320,150) {
@Override
public void onResourceReady(byte[] bytes, GlideAnimation<? super byte[]> arg1) {
String base64Data = Base64.encodeToString(bytes, Base64.DEFAULT);
}
});
Glide動態加載本地base64或者服務器URL
在設置圖片時,我們往往需要將本地圖片轉換成base64上傳服務器,服務器再將base64解析成圖片,將服務器中圖片的URL返回給移動端。
這時候要考慮異步顯示:假如本地只保存了base64數據(服務器尚未返回或者斷網狀態下),我們要求存儲的圖片資源也要能夠顯示。
基本的思路有兩種,根據實際的需求來選擇。
- 1,將選取的圖片保存成本地的圖片(文件),數據庫中保存的是本地的路徑,根據本地路徑顯示
- 2,數據庫中保存的就是base64數據,根據base64顯示
第一種很好實現,在此處不再記錄。
第二種方案如下:
if(!TextUtils.isEmpty(car.getCarpic())){
//carpic存放的是否是URL資源
if(car.getCarpic().startsWith("http")){
Glide.with(this).load(car.getCarpic()).into(im_car_pic);
}else{
//當存放的是base64數據時
Glide.with(this).load(Base64.decode(car.getCarpic(), Base64.DEFAULT)).into(im_car_pic);
}
}
Gson 數據轉換成json字符串時,默認會對一些特殊字符進行轉義
這種情況下,如果服務器存在對Json數據的驗證就會導致服務器端進行簽名驗證不會通過。
比如圖片的base64數據,其末尾=\n處的=會被轉義為\u003d,這時候如果對數據進行簽名驗證就會失敗。
具體的字符串轉義情況大致如下:
REPLACEMENT_CHARS['"'] = "\\\"";
REPLACEMENT_CHARS['\\'] = "\\\\";
REPLACEMENT_CHARS['\t'] = "\\t";
REPLACEMENT_CHARS['\b'] = "\\b";
REPLACEMENT_CHARS['\n'] = "\\n";
REPLACEMENT_CHARS['\r'] = "\\r";
REPLACEMENT_CHARS['\f'] = "\\f";
HTML_SAFE_REPLACEMENT_CHARS = REPLACEMENT_CHARS.clone();
HTML_SAFE_REPLACEMENT_CHARS['<'] = "\\u003c";
HTML_SAFE_REPLACEMENT_CHARS['>'] = "\\u003e";
HTML_SAFE_REPLACEMENT_CHARS['&'] = "\\u0026";
HTML_SAFE_REPLACEMENT_CHARS['='] = "\\u003d";
HTML_SAFE_REPLACEMENT_CHARS['\''] = "\\u0027";
解決這個問題的方法是:
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
Glide加載圖片慢?
取消默認的加載動畫
Glide.with(this).load(vcar.getCarpic()).dontAnimate().into(im_car_pic);
更多用法,持續更新中......