目錄
什么是fresco?
為什么要設計fresco?
fresco有什么特性?
fresco的架構原理
內存機制
GenericDraweeHierarchy 層級結構
參考資料
官網(wǎng)https://www.fresco-cn.org
githubhttps://github.com/facebook/fresco

FaceBook 說的如下:
對于Android平臺的Facebook來說,快速而高效的展示圖片是很重要的。不過近年來,我們在如何高效地存儲圖片方面遇到了很多問題。圖片所需空間很大,而設備上空間很小。每個像素占用4個字節(jié),分別為紅、綠、藍和α透明度。如果一個手機的屏幕尺寸是480*800像素,一張全屏的圖片就占用1.5MB的內存。通常手機的內存很少,并且Android設備在眾多應用程序之間會平均分配自身的內存。在一些設備上,F(xiàn)acebook程序內存被限制在16MB,可是僅僅一張圖片就占用了十分之一!
當你的應用程序運行超出內存時會發(fā)生什么?它會crash。我們打算通過創(chuàng)建我們稱之為Fresco的庫來解決這個問題。它能管理圖片及其所占內存,Crash便隨之消失了。
總結:就是處理圖片OOM問題,對圖片做內存管理。
內存管理
圖片加載
圖片繪制
圖片的漸進式呈現(xiàn)
動圖加載
栗子:
ControllerListenerlistener = newBaseControllerListener(){...}DraweeControllercontroller =Fresco.newDraweeControllerBuilder()? ? .setUri(uri)? ? .setTapToRetryEnabled(true)? ? .setOldController(mSimpleDraweeView.getController())? ? .setControllerListener(listener)? ? .build();mSimpleDraweeView.setController(controller);
弄懂fresco的架構原理,需要知道
fresco是如何獲取圖片數(shù)據(jù)?
獲取到的圖片數(shù)據(jù)是如何顯示的?
SimpleDraweeViewAbstractDraweeControllerBuilderPipelineDraweeControllerPipelineDraweeControllerBuilderImagePipelineProducerSequenceFactoryNetworkFetchProducerConsumerMemoryCacheDraweeHolderAbstractDraweeControllerAbstractDataSourceAbstractDraweeController.DataSubscriberGenericDraweeHierarchyForwardingDrawableSimpleDraweeViewinitsetImageURIbuildbuildControllerobtainControllerobtainDataSourceSuppliergetDataSourceSupplierForRequestgetDataSourceForRequestfetchDecodedImagegetDecodedImageProducerSequencegetBasicDecodedImageSequence(uri的區(qū)別對待)getNetworkFetchSequence(走網(wǎng)絡)getCommonNetworkFetchToEncodedMemorySequence(encoded cache -> disk cache -> (webp transcode) -> network fetch)reurn ProductersubmitFetchRequestproduceResults(從網(wǎng)絡上獲取數(shù)據(jù))notifyConsumer(轉化成encodeimage 給消費者消費)onNewResultImpl()cachesetController(設置圖片)attachControlleronAttachsubmitRequestgetCachedImagegetCachedImage(return cache image)subscribe(注冊監(jiān)聽)notifyDataSubscriber(ui線程,通知監(jiān)聽者)onNewResultImpl(回調)onNewResultInternal(關鍵)createDrawablesetImagesetDrawable(設置圖片)SimpleDraweeViewAbstractDraweeControllerBuilderPipelineDraweeControllerPipelineDraweeControllerBuilderImagePipelineProducerSequenceFactoryNetworkFetchProducerConsumerMemoryCacheDraweeHolderAbstractDraweeControllerAbstractDataSourceAbstractDraweeController.DataSubscriberGenericDraweeHierarchyForwardingDrawable
ps:最后下面的mDraweeHolder.getTopLevelDrawable()會從ForwardingDrawable 中獲取到設置的drawable.
/** Sets the controller. */publicvoidsetController(@NullableDraweeController draweeController){mDraweeHolder.setController(draweeController);super.setImageDrawable(mDraweeHolder.getTopLevelDrawable());? }

1-8:get data 獲取數(shù)據(jù)階段
9-12:set data 設置圖片階段
三級緩存(兩級內存,一級文件)
Bitmap緩存
未解碼圖片的內存緩存
文件緩存
Android5.0以前bitmap是緩存在ashmem(共享內存)里。
Android5.0及以上保存在java堆里。
為了釋放bitmap, fresco定義了引用計數(shù)類SharedPrefrence,計數(shù)為0,則回收。
Hierarchy是樹形結構
占位圖
真實圖
進度圖
重試圖
失敗圖
覆蓋層圖
Fresco開源:https://mp.weixin.qq.com/s/uNCWHYZi3M4khR2414FvKA
Fresco 內存回收:http://blog.csdn.net/brycegao321/article/details/52440640