【轉】Fresco之強大之余的痛楚


http://www.jianshu.com/p/5364957dcf49

 

開始之前

如果你有使用的心得,技巧,踩坑經歷,希望貢獻出來,我會在TODO中慢慢添加(^^)/

關於Fresco

  Fresco 是一個強大的圖片加載組件。
  Fresco 中設計有一個叫做*image pipeline*的模塊。它負責從網絡,從本地文件系統,本地資源加載圖片。為了最大限度節省空間和CPU時間,它含有3級緩存設計(2級內存,1級文件)。 Fresco 中設計有一個叫做*Drawees*模塊,方便地顯示loading圖,當圖片不再顯示在屏幕上時,及時地釋放內存和空間占用。 Fresco 支持 Android2.3(API level 9) 及其以上系統。

如果你還不知道Fresco是什么?那么建議一定得去了解下: Fresco官方文檔 ; 同時, 建議在看文檔的時候優先選擇閱讀英文文檔, 因為中文版文檔可能有滯后的情況,這樣會避免很多不必要的麻煩。另外,當有問題產生時, 建議去其Fresco Github Issues去進行翻閱查找, 此處匯聚了許多Fresco使用和問題的反饋及解答,往往可能會解決你的一些基本疑惑,甚至,你自己Open New Issue亦無不可。

使用Fresco

這其實不是我寫此文章的目的, 因為關於使用, 官方文檔已經足夠詳細;並且多篇博客已經進行了解讀和使用引導,甚至可運行閱讀和Demo。
什么?想在這兒也學習學習,好吧, 人都是懶惰的,何況我們程序員~~!
那么,我就簡單做個收集吧(也不就是Google Or Baidu Or ... 其他搜索引擎):

如果你覺得你有更好的鏈接,請推薦哦

中文文檔
    http://www.fresco-cn.org/ ; 如果真心讀不懂英文或者不想讀, 那么這里,你可以去看看。
導入官方示例
    http://www.cnblogs.com/stay/p/4398432.html; 簡單看了下,還不錯, 講的相對詳細,我並未細看。因為其實導入和編譯項目該是開發的基本功吧,(*^__^*) 嘻嘻……
簡單使用
    http://blog.csdn.net/y1scp/article/details/49245535; 非常詳細的使用教程了吧,作者還是比較有心的,點個贊。
進階研究

1.Fresco源碼解析 - 本地編譯
2.Fresco源碼解析 - Hierarachy-View-Controller
3.Fresco源碼解析 - DraweeView
4.Fresco源碼解析 - 初始化過程分析
5.Fresco源碼解析 - DataSource怎樣存儲數據

這是一個作者的系列博客吧,具體內容還沒時間細細品讀,但是能堅持寫,可見很有耐心。

Update 進階1: 2015/12/22

昨晚閑來無事逛微博, 發現一個0.7.0版本Fresco的源碼解析,看了看, 很是不錯,在此更新推薦給大家:

Fresco-Source-Analysis
目前看到最好的Fresco的源碼解讀了吧

Demo

Kaede

Fresco-Sample-Usage
這個算是一個不錯的示例項目吧,可以參考不少東西,具體對項目的介紹,自己去看doc,或者簡書中Facebook開源的Android圖片加載庫Fresco的Demo項目也有介紹;

Huqiu Liao

fresco-demo-for-gradle
秋百萬作品,絕對精品。 有個圖片加載開源的簡單對比,用法也很多,非常有參考價值。值得一提的是,貌似中文文檔也是秋百萬的作品fresco-docs-cn,可以去觀摩一下,我不肯定,但是感覺是。

開源庫使用之痛

Fresco強大,卻也並不完美,但一直在更新,所以,不管你考慮使用,都建議持續關注開源庫的發展和更新,因為說不定,就會有好消息,讓你學習,讓你輕松。

本人是非常欣賞開源作者的各種開源作品,也樂於使用,只是,開源庫之初,總有很多不盡如人意的地方,這也是常說的,~

是的,這才是本文的重點

本人在新項目中使用Fresco庫,非常感謝Facebook~

實際使用, 就會遇到各種問題,而我之所以寫,也只是因為有些問題, 確實值得我們注意, 寫下了,防止自己下次再犯, 同時,也給遇到類似問題的一些參考吧:

一般情況下,直接 Fresco.initialized(context) 初始化后,在布局中進行如下引用

  <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="130dp" android:layout_height="130dp" fresco:placeholderImage="@drawable/ic_launcher" />

就已經可以應付大部分情況了, 也無需擔心其他問題;
稍等: 吐槽下, 居然寬高基礎使用是必須設置具體的dp值的

可是,本人在使用時,偏偏就是用來做相冊多選(自作孽,(⊙﹏⊙)b):

那么問題來了 ,

首先的問題就是OOM。。。

額, 這么強大的庫也能OOM?
都知道,多圖加載確實好內存,可是,別的三方庫是OK的哇,什么情況?

當然是使用姿勢不太對, 是的, 宮格顯示就是大圖顯示, 導致拖動都卡頓, 於是, 做了優化:

  public static void showThumb(Uri uri, SimpleDraweeView draweeView){ ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .setResizeOptions(new ResizeOptions(DensityUtil.dip2px(144), DensityUtil.dip2px(144))) .build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request) .setOldController(draweeView.getController()) .setControllerListener(new BaseControllerListener<ImageInfo>()) .build(); draweeView.setController(controller); }

乍一看,好爽,自動替我Resize了圖片, 還抽取個方法, 好復用, 好爽,O(∩_∩)O~;
Tip: 如果Resize后還會出現問題,那么可能參數設置的問題了吧,細查下寬高大小之類吧

運行試了試, 咦~ 滑動好順暢。。。難道就好了?Oh~No, 新問題出現了,

圖片顯示不全 (具體表現為顯示為純白色,或純黑色)

什么鬼?
也是疑惑異常,之前不Resize之前還能顯示的,怎么現在反而有些顯示不出了?難道是這個方法有什么問題?
遂查看官方文檔Resizing,看完心中大呼: 法克~ 細節,細節, 細節


U0~EIQSZBP5ELOH$@`EVU%3.png

人家文檔說的很清楚嘛,此方法 只支持JPG, 只支持JPG, 只支持JPG, ,內心
此時是崩潰的,心中想, 只支持JPG怎么夠用,現在png的,webp的各種格式的怎么辦...

往下順着看, 好吧, 哈哈, 請允許我竊喜,是的,官方提供了方法來支持更多格式:


(5LX_1O0V997KM$JL5R_ULR.png

Tip: 此處記得,不是setDownsampleEnabled(true)就可以了,還得調用之前的Resize方法,人家文檔也說的很明白了

好吧, 也許即使如此,有些人還不知如何設定這個屬性呢,其實很簡單哇,人家Configuration是可以定義的哇, 初始化的時候進行定義

ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this) .setDownsampleEnabled(true) .build(); Fresco.initialize(this, config);

嗯, 是的, Fresco和其他圖片加載框架一樣,也是支持自定義一些Config屬性的,支持很多,什么DiskCacheConfig、ImagePipelineConfig、MemoryCacheParams等很多,自行看官方文檔進行腦補吧~

好吧,問題是否解決了呢,本人運行看了看,ok, 之前白屏的地方,圖片出來了,滑動看看呢, 還不錯哦。

更多

當然,也還有很多使用上的問題,我會再使用的同時在此繼續更新一些,以使自己能溫故而知新。

另外,我是喜歡做好人的, 如果你懶, 那么,當你出現問題,有幾個地方你得去瞅瞅咯:

Fresco Issue 567 這里有一些PNG圖片展示的TooManyBitmapsException

Fresco Issue 84 可以參考看看評論中解決問題的過程

Fresco Issue 738 不知道怎么設置緩存?可作參考

本人也單獨配置了一份很詳細的Config, 大家也可以根據自己的需要進行個性化配置。

todo 2015/12/18

  此處占坑, 用來總結更多~~

結尾

很多時候, 知道強大的東西還不夠,我們還都會用,會用還不夠,甚至還得去研習如何用的更精, 用精對於好多人依然不夠, 因為還要知道其原理, 甚至學習和自己構建;

最后, 本人正在技術探索的路上, 苦於平時工作壓力較大, 時間相對較少, 難免寫的過程了有疏漏, 甚至更多,若恰好, 你看到了有問題之處, 或者有建議修改, 那么, 請提出來吧, 幫助我進步 , 謝謝~



文/Aegis(簡書作者)
原文鏈接:http://www.jianshu.com/p/5364957dcf49
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM