開(kāi)始之前
如果你有使用的心得狞玛,技巧,踩坑經(jīng)歷,希望貢獻(xiàn)出來(lái)邮偎,我會(huì)在TODO中慢慢添加(^^)/
關(guān)于Fresco
Fresco 是一個(gè)強(qiáng)大的圖片加載組件。
Fresco 中設(shè)計(jì)有一個(gè)叫做*image pipeline*的模塊义黎。它負(fù)責(zé)從網(wǎng)絡(luò)禾进,從本地文件系統(tǒng),本地資源加載圖片廉涕。為了最大限度節(jié)省空間和CPU時(shí)間泻云,它含有3級(jí)緩存設(shè)計(jì)(2級(jí)內(nèi)存,1級(jí)文件)狐蜕。
Fresco 中設(shè)計(jì)有一個(gè)叫做*Drawees*模塊宠纯,方便地顯示loading圖,當(dāng)圖片不再顯示在屏幕上時(shí)层释,及時(shí)地釋放內(nèi)存和空間占用婆瓜。
Fresco 支持 Android2.3(API level 9) 及其以上系統(tǒng)。
如果你還不知道Fresco是什么湃累?那么建議一定得去了解下: Fresco官方文檔 ; 同時(shí)勃救, 建議在看文檔的時(shí)候優(yōu)先選擇閱讀英文文檔碍讨, 因?yàn)橹形陌嫖臋n可能有滯后的情況,這樣會(huì)避免很多不必要的麻煩蒙秒。另外勃黍,當(dāng)有問(wèn)題產(chǎn)生時(shí), 建議去其Fresco Github Issues去進(jìn)行翻閱查找晕讲, 此處匯聚了許多Fresco使用和問(wèn)題的反饋及解答覆获,往往可能會(huì)解決你的一些基本疑惑,甚至瓢省,你自己Open New Issue亦無(wú)不可弄息。
使用Fresco
這其實(shí)不是我寫(xiě)此文章的目的, 因?yàn)殛P(guān)于使用勤婚, 官方文檔已經(jīng)足夠詳細(xì)摹量;并且多篇博客已經(jīng)進(jìn)行了解讀和使用引導(dǎo),甚至可運(yùn)行閱讀和Demo馒胆。
什么缨称?想在這兒也學(xué)習(xí)學(xué)習(xí),好吧祝迂, 人都是懶惰的睦尽,何況我們程序員~~!
那么型雳,我就簡(jiǎn)單做個(gè)收集吧(也不就是Google Or Baidu Or ... 其他搜索引擎):
如果你覺(jué)得你有更好的鏈接当凡,請(qǐng)推薦哦
中文文檔
http://www.fresco-cn.org/ ; 如果真心讀不懂英文或者不想讀纠俭, 那么這里沿量,你可以去看看。
導(dǎo)入官方示例
http://www.cnblogs.com/stay/p/4398432.html冤荆; 簡(jiǎn)單看了下欧瘪,還不錯(cuò), 講的相對(duì)詳細(xì)匙赞,我并未細(xì)看佛掖。因?yàn)槠鋵?shí)導(dǎo)入和編譯項(xiàng)目該是開(kāi)發(fā)的基本功吧,(*^__^*) 嘻嘻……
簡(jiǎn)單使用
http://blog.csdn.net/y1scp/article/details/49245535; 非常詳細(xì)的使用教程了吧涌庭,作者還是比較有心的芥被,點(diǎn)個(gè)贊。
進(jìn)階研究
1.Fresco源碼解析 - 本地編譯
2.Fresco源碼解析 - Hierarachy-View-Controller
3.Fresco源碼解析 - DraweeView
4.Fresco源碼解析 - 初始化過(guò)程分析
5.Fresco源碼解析 - DataSource怎樣存儲(chǔ)數(shù)據(jù)
這是一個(gè)作者的系列博客吧坐榆,具體內(nèi)容還沒(méi)時(shí)間細(xì)細(xì)品讀拴魄,但是能堅(jiān)持寫(xiě),可見(jiàn)很有耐心。
** Update 進(jìn)階1: 2015/12/22**
昨晚閑來(lái)無(wú)事逛微博, 發(fā)現(xiàn)一個(gè)0.7.0版本Fresco的源碼解析,看了看, 很是不錯(cuò),在此更新推薦給大家:
Fresco-Source-Analysis
目前看到最好的Fresco的源碼解讀了吧
Demo
Fresco-Sample-Usage
這個(gè)算是一個(gè)不錯(cuò)的示例項(xiàng)目吧匹中,可以參考不少東西夏漱,具體對(duì)項(xiàng)目的介紹,自己去看doc顶捷,或者簡(jiǎn)書(shū)中Facebook開(kāi)源的Android圖片加載庫(kù)Fresco的Demo項(xiàng)目也有介紹挂绰;
** Huqiu Liao **
fresco-demo-for-gradle
秋百萬(wàn)作品,絕對(duì)精品服赎。 有個(gè)圖片加載開(kāi)源的簡(jiǎn)單對(duì)比葵蒂,用法也很多,非常有參考價(jià)值重虑。值得一提的是践付,貌似中文文檔也是秋百萬(wàn)的作品fresco-docs-cn,可以去觀摩一下,我不肯定缺厉,但是感覺(jué)是永高。
開(kāi)源庫(kù)使用之痛
Fresco強(qiáng)大,卻也并不完美提针,但一直在更新乏梁,所以,不管你考慮使用关贵,都建議持續(xù)關(guān)注開(kāi)源庫(kù)的發(fā)展和更新,因?yàn)檎f(shuō)不定卖毁,就會(huì)有好消息揖曾,讓你學(xué)習(xí),讓你輕松亥啦。
本人是非常欣賞開(kāi)源作者的各種開(kāi)源作品炭剪,也樂(lè)于使用,只是翔脱,開(kāi)源庫(kù)之初奴拦,總有很多不盡如人意的地方,這也是常說(shuō)的届吁,坑~
是的错妖,這才是本文的重點(diǎn)
本人在新項(xiàng)目中使用Fresco庫(kù),非常感謝Facebook~
實(shí)際使用疚沐, 就會(huì)遇到各種問(wèn)題暂氯,而我之所以寫(xiě),也只是因?yàn)橛行﹩?wèn)題亮蛔, 確實(shí)值得我們注意痴施, 寫(xiě)下了,防止自己下次再犯, 同時(shí)辣吃,也給遇到類(lèi)似問(wèn)題的一些參考吧:
一般情況下动遭,直接 Fresco.initialized(context) 初始化后,在布局中進(jìn)行如下引用
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/ic_launcher" />
就已經(jīng)可以應(yīng)付大部分情況了神得, 也無(wú)需擔(dān)心其他問(wèn)題厘惦;
** 稍等: 吐槽下, 居然寬高基礎(chǔ)使用是必須設(shè)置具體的dp值的 **
可是循头,本人在使用時(shí)绵估,偏偏就是用來(lái)做相冊(cè)多選(自作孽,(⊙﹏⊙)b):
那么問(wèn)題來(lái)了 卡骂,
首先的問(wèn)題就是OOM国裳。。全跨。
額缝左, 這么強(qiáng)大的庫(kù)也能OOM?
都知道,多圖加載確實(shí)好內(nèi)存浓若,可是渺杉,別的三方庫(kù)是OK的哇,什么情況挪钓?
當(dāng)然是使用姿勢(shì)不太對(duì)是越, 是的, 宮格顯示就是大圖顯示碌上, 導(dǎo)致拖動(dòng)都卡頓倚评, 于是, 做了優(yōu)化:
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);
}
乍一看馏予,好爽天梧,自動(dòng)替我Resize了圖片, 還抽取個(gè)方法霞丧, 好復(fù)用呢岗, 好爽,O(∩_∩)O~蛹尝;
** Tip: 如果Resize后還會(huì)出現(xiàn)問(wèn)題后豫,那么可能參數(shù)設(shè)置的問(wèn)題了吧,細(xì)查下寬高大小之類(lèi)吧 **
運(yùn)行試了試突那, 咦~ 滑動(dòng)好順暢硬贯。。陨收。難道就好了饭豹?Oh~No鸵赖, 新問(wèn)題出現(xiàn)了,
** 圖片顯示不全 (具體表現(xiàn)為顯示為純白色拄衰,或純黑色)**
什么鬼它褪?
也是疑惑異常,之前不Resize之前還能顯示的翘悉,怎么現(xiàn)在反而有些顯示不出了茫打?難道是這個(gè)方法有什么問(wèn)題?
遂查看官方文檔Resizing妖混,看完心中大呼: 法克~ 細(xì)節(jié)老赤,細(xì)節(jié), 細(xì)節(jié)
人家文檔說(shuō)的很清楚嘛制市,此方法 **只支持JPG, 只支持JPG, 只支持JPG, **抬旺,內(nèi)心
此時(shí)是崩潰的,心中想祥楣, 只支持JPG怎么夠用开财,現(xiàn)在png的,webp的各種格式的怎么辦...
往下順著看误褪, 好吧责鳍, 哈哈, 請(qǐng)?jiān)试S我竊喜兽间,是的历葛,官方提供了方法來(lái)支持更多格式:
** Tip: 此處記得,不是setDownsampleEnabled(true)就可以了嘀略,還得調(diào)用之前的Resize方法恤溶,人家文檔也說(shuō)的很明白了**
好吧, 也許即使如此屎鳍,有些人還不知如何設(shè)定這個(gè)屬性呢,其實(shí)很簡(jiǎn)單哇问裕,人家Configuration是可以定義的哇逮壁,** 初始化的時(shí)候進(jìn)行定義 **:
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setDownsampleEnabled(true)
.build();
Fresco.initialize(this, config);
嗯, 是的粮宛, Fresco和其他圖片加載框架一樣窥淆,也是支持自定義一些Config屬性的,支持很多巍杈,什么DiskCacheConfig忧饭、ImagePipelineConfig、MemoryCacheParams等很多筷畦,自行看官方文檔進(jìn)行腦補(bǔ)吧~
好吧词裤,問(wèn)題是否解決了呢刺洒,本人運(yùn)行看了看,ok吼砂, 之前白屏的地方逆航,圖片出來(lái)了,滑動(dòng)看看呢渔肩, 還不錯(cuò)哦因俐。
** 更多 **
當(dāng)然,也還有很多使用上的問(wèn)題周偎,我會(huì)再使用的同時(shí)在此繼續(xù)更新一些抹剩,以使自己能溫故而知新。
另外蓉坎,我是喜歡做好人的澳眷, 如果你懶, 那么袍嬉,當(dāng)你出現(xiàn)問(wèn)題境蔼,有幾個(gè)地方你得去瞅瞅咯:
Fresco Issue 567 這里有一些PNG圖片展示的TooManyBitmapsException
Fresco Issue 84 可以參考看看評(píng)論中解決問(wèn)題的過(guò)程
Fresco Issue 738 不知道怎么設(shè)置緩存?可作參考
本人也單獨(dú)配置了一份很詳細(xì)的Config伺通, 大家也可以根據(jù)自己的需要進(jìn)行個(gè)性化配置箍土。
todo 2015/12/18
此處占坑, 用來(lái)總結(jié)更多~~
結(jié)尾
很多時(shí)候罐监, 知道強(qiáng)大的東西還不夠吴藻,我們還都會(huì)用,會(huì)用還不夠弓柱,甚至還得去研習(xí)如何用的更精沟堡, 用精對(duì)于好多人依然不夠, 因?yàn)檫€要知道其原理矢空, 甚至學(xué)習(xí)和自己構(gòu)建航罗;
最后, 本人正在技術(shù)探索的路上屁药, 苦于平時(shí)工作壓力較大粥血, 時(shí)間相對(duì)較少, 難免寫(xiě)的過(guò)程了有疏漏酿箭, 甚至更多复亏,若恰好, 你看到了有問(wèn)題之處缭嫡, 或者有建議修改缔御, 那么, 請(qǐng)?zhí)岢鰜?lái)吧妇蛀, 幫助我進(jìn)步 耕突, 謝謝~