Android踩坑日记:使用Fesco图片加载库在GridView上的卡顿优化
1,fresco是一個強大的圖片加載庫
2,fresco設計了一個叫做image pipeline(圖片管道)的模塊,它負責從從網絡,從本地文件系統,從本地資源加載圖片,為了最大限度節約資源和cpu時間,它設計了3級緩存(2級內存,1級文件)
3,fresco設計了一個叫做drawee的模塊,方便地顯示loading圖,當圖片不再顯示在屏幕上時,及時地釋放內存和空間占用。
4,支持 Android2.3(API level 9) 及其以上系統。
推薦資源
本篇文章的目的不是講fresco的原理和使用,但是還是整理一下資源,方便以后學習使用。
1,官方文檔:Fresco官方文檔 ,建議在看文檔的時候優先選擇閱讀英文文檔, 因為中文版文檔可能有滯后的情況,這樣會避免很多不必要的麻煩。
2,中文文檔:Fresco中文文檔
3,GitHub地址:Fresco的GitHub地址
4,引入官方示例:官方示例 簡單看了下,還不錯, 講的相對詳細,我并未細看。
5,簡單使用技巧:簡單使用教程,非常詳細的使用教程了吧,作者還是比較有心的,點個贊。
6,進階研究:
???a.Fresco源碼解析 - 初始化過程分析
???b.Fresco源碼解析 - 本地編譯
???c.Fresco源碼解析 - Hierarachy-View-Controller
???d.Fresco源碼解析 - DraweeView
???e.Fresco源碼解析 - DataSource怎樣存儲數據
7,目前看到的最全的源碼解析:Fresco-Source-Analysis
8,不錯的Fresco的Demo:Fresco-Sample-Usage
9,Fresco在中國的推廣人秋百萬的作品:fresco-demo-for-gradle,fresco-docs-cn秋百萬作品,絕對精品。 有個圖片加載開源的簡單對比,用法也很多,非常有參考價值。值得一提的是,貌似中文文檔也是秋百萬的作品使用的坑
Fresco強大,卻也并不完美,但一直在更新,所以,不管你考慮使用,都建議持續關注開源庫的發展和更新,因為說不定,就會有好消息,讓你學習,讓你輕松
第一次使用Fresco是要做一個網格相冊的模塊,一般情況下,直接 Fresco.initialized(context) 初始化后,在布局中進行如下引用
就已經可以應付大部分情況了, 也無需擔心其他問題;
稍等: 吐槽下, 居然寬高基礎使用是必須設置具體的dp值的
但是我第一是使用Fresco,是需要做一個網格相冊,需要加載大量圖片,首先來的問題是滑動卡頓,再者是OOM內存溢出,
這么強大的庫也能OOM?
都知道,多圖加載確實耗內存,可是,別的三方庫是OK的哇,什么情況?一定是使用的姿勢不對。宮格顯示就是大圖顯示, 導致拖動都卡頓。
項目中是這樣設置的
雖然設置的縮放類型是centerCrop居中裁切,但是并沒有生效,原生ImageView的centerCrop居中裁切是將原始圖片(如3000*4000,5M的圖片),在居中裁切ImageView的大小放在內存中顯示,并不是把整個圖片放在內存中。
這時候就想到了Fresco的三級緩存機制,第三級是文件緩存,第二級是Fresco偷android系統的緩存存放原始圖片,從第二級解碼得到顯示圖片的一級內存,就是視覺上看到的ImageView圖片都在一級內存
查閱官方文檔:https://www.fresco-cn.org/docs/resizing-rotating.html,發現需要縮放圖片,于是在顯示圖片之前,做了處理
/*** 解碼前修改內存中的圖片大小* @param uri 文件的uri* @param draweeView 顯示的imageview*/public void showThumbNail(Uri uri, SimpleDraweeView draweeView){int width = ScreenUtils.dp2px(context,119);int height = ScreenUtils.dp2px(context,119);LogUtils.e("http",width+"_"+height);ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).setResizeOptions(new ResizeOptions(width, height)).build();DraweeController controller = Fresco.newDraweeControllerBuilder().setImageRequest(request).setOldController(draweeView.getController()).setControllerListener(new BaseControllerListener<ImageInfo>()).build();draweeView.setController(controller);}運行試了試, 咦~ 滑動好順暢。。。難道就好了?Oh~No, 新問題出現了
圖片顯示不全 (具體表現為顯示為純白色,或純黑色)
遂查看官方文檔,真是細節問題。
人家文檔說的很清楚嘛,此方法 只支持JPG, 只支持JPG, 只支持JPG, ,內心
此時是崩潰的,心中想, 只支持JPG怎么夠用,現在png的,webp的各種格式的怎么辦…
往下順著看, 好吧, 哈哈, 請允許我竊喜,是的,官方提供了方法來支持更多格式:
Tip: 此處記得,不是setDownsampleEnabled(true)就可以了,還得調用之前的Resize方法,人家文檔也說的很明白了
好吧, 也許即使如此,有些人還不知如何設定這個屬性呢,其實很簡單哇,人家Configuration是可以定義的哇, 初始化的時候進行定義 :
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this) .setDownsampleEnabled(true) .build();Fresco.initialize(this, config);這樣就OK了,運行很流暢,也沒有純白或者純黑了。
總結
學習一個新的項目,框架,開源庫的方法很重要,學習搜索相關資源,閱讀官方文檔,查閱別人博客,我覺得在工作中學習新東西還是需要時間,畢竟平時項目開發緊,沒有太多時間研究。以后學習新東西按一下步驟:1,看看別人博客,了解基本用法,2,查閱官方文檔,中文文檔,github,3,弄清楚原理,源碼,庫中的各個模塊是什么關系
總結
以上是生活随笔為你收集整理的Android踩坑日记:使用Fesco图片加载库在GridView上的卡顿优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android踩坑日记:点击变暗效果的I
- 下一篇: Android踩坑日记:Floating