標籤:tom 用法 代碼 read pac master 佔用 官方 adt
一、前言:再優秀的開源庫都有坑要填
手上的項目使用的圖片載入架構是:Universal-Image-Loader+業務需要定製化的一些代碼。Universal-Image-Loader 這個架構是一個非常經典好用的架構,唯一的問題是是作者很久之前就不再更新了。所以綜合考慮下,確定使用Glide+封裝代替當前的圖片載入架構。
二、困惑:
在沒有真正使用 Glide 之前,我所看到的文章基本都是讚美這個庫的功能強大,載入流暢。然而,當我用上了以後,才發現並不完美。遇到了不少的坑,需要自己填。
2.1 Glide 配合 OKHttp 使用的坑:
需要在Gradle中引入:
compile "com.github.bumptech.glide:glide:3.7.0"
compile "com.github.bumptech.glide:okhttp3-integration:[email protected]"
這裡就有一個坑,如果你用到自訂的 GlideModule,這裡的可能會失效,被com.github.bumptech.glide:okhttp3-integration:[email protected]預設的替換
解決方案是升級版本號碼:
compile "com.github.bumptech.glide:okhttp3-integration:[email protected]" -》 compile "com.github.bumptech.glide:okhttp3-integration:1.5.0"
注意,沒有@arr 還有1.5.0預設選擇是3.8.0的glide 所以改一下3.7.0的引入compile "com.github.bumptech.glide:glide:3.7.0"-》compile "com.github.bumptech.glide:glide:3.8.0"
2.2 OKHttpClient 逾時設定導致圖片無法載入坑:
因為Glide本身只負責圖片載入,網路請求圖片資料由網路架構決定。網路請求一般會有逾時的問題,坑的是OKHttp預設的逾時時間太短了,如果不修改,網路狀態比較差
就很容易請求逾時,圖片自然就載入不出來。我設定的參數是60,60,30這個可以自己根據實際情況確定。
//這個是源碼裡面的,預設逾時時間,都是10s,10000msconnectTimeout = 10_000;readTimeout = 10_000;writeTimeout = 10_000;//手動設定逾時時間 OkHttpClient client=new OkHttpClient.Builder() .connectTimeout(HTTP_CONNECT_TIMEOUT, TimeUnit.SECONDS) .readTimeout(HTTP_READ_TIMEOUT, TimeUnit.SECONDS) .writeTimeout(HTTP_WRITE_TIMEOUT, TimeUnit.SECONDS) .build;
2.3 Glide 查看 log 的坑:
如果你使用 Glide 經常出現圖片載入不出來或者載入有問題,你需要查看 Glide 本身的 log,不過這個必須通過 adb 命令開啟,詳情百度,需要注意如果是請求圖片問題,關注請求的 log,圖片載入||轉換的問題,關注圖片載入||轉換的log。
2.4 Glide 載入的圖片記憶體佔用巨多的坑:
在使用 Glide 的第一個版本,OOM 問題一下子爆炸了,查看記憶體佔用,使用 Universal-Image-Loader 的舊版本,App 佔用50m~80m記憶體,
而使用 Glide 載入列表大圖的時候,突然猛增到120M+,低端機器自然很容易就 OOM 了。
Glide 有一個優點被很多人稱讚,就是它會根據圖片控制項的大小對 Bitmap 進程縮放處理,適應控制項的大小。
但是,如果是一個控制項,在高分屏下,它的控制項大小往往比實際圖片尺寸大很多,舉例一個控制項:
長寬:1080400,圖片原始大小540200,如果不做任何設定,Glide 會把 bitmap 放大到控制項大小,那麼佔用的記憶體就變成了原始大小四倍。。。
這個是 Glide 的特性,暫時沒有找到的方法修改。
臨時方案:為了避免Glide自動把bitmap放大,使用在載入圖片的時候,使用 .override(width, height) 限制圖片的寬高
2.5 Glide 使用過渡動畫造成圖片變形的 bug
Glide 預設會載入圖片的時候會有一個過渡效果,其原理是採用TransitionDrawable實現的。
但是這個和 placeHolder,一起使用,尤其是你的playHolder的尺寸比你載入的圖片要大,這個時候就會出現,你載入出來的圖片變形的問題。
很多人推薦使用 .dontAnimate() 解決問題,即去掉過渡動畫。
但是,如果產品一定需要加入過渡動畫,官方其實沒有提供完美的解決方案,Glide的作者之一在stackoverflow有回答並且給出了 github 的代碼。
http://stackoverflow.com/questions/32235413/glide-load-drawable-but-dont-scale-placeholder
https://github.com/TWiStErRob/glide-support/tree/master/src/glide4/java/com/bumptech/glide/supportapp
注意:我在使用的過程中發現,如果你的ImageView的type是center_crop 的話,那麼必須確保你的place_holder預設圖片,長寬小於你載入的圖片,不然即使使用的了作者的代碼,任然會有變形的問題。
Android Studio 第六十七期 - Android Glide3.7.0和3.8.0用法