Fresco 原理淺析

目錄

什么是fresco?

為什么要設計fresco?

fresco有什么特性?

fresco的架構原理

內存機制

GenericDraweeHierarchy 層級結構

參考資料

什么是Fresco?

官網(wǎng)https://www.fresco-cn.org

githubhttps://github.com/facebook/fresco

為什么要設計Fresco?

FaceBook 說的如下:

對于Android平臺的Facebook來說,快速而高效的展示圖片是很重要的。不過近年來,我們在如何高效地存儲圖片方面遇到了很多問題。圖片所需空間很大,而設備上空間很小。每個像素占用4個字節(jié),分別為紅、綠、藍和α透明度。如果一個手機的屏幕尺寸是480*800像素,一張全屏的圖片就占用1.5MB的內存。通常手機的內存很少,并且Android設備在眾多應用程序之間會平均分配自身的內存。在一些設備上,F(xiàn)acebook程序內存被限制在16MB,可是僅僅一張圖片就占用了十分之一!

當你的應用程序運行超出內存時會發(fā)生什么?它會crash。我們打算通過創(chuàng)建我們稱之為Fresco的庫來解決這個問題。它能管理圖片及其所占內存,Crash便隨之消失了。

總結:就是處理圖片OOM問題,對圖片做內存管理。

Fresco有什么特性?

內存管理

圖片加載

圖片繪制

圖片的漸進式呈現(xiàn)

動圖加載

Fresco架構原理

栗子:

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());? }

Fresco架構圖

1-8:get data 獲取數(shù)據(jù)階段

9-12:set data 設置圖片階段

內存機制

三級緩存(兩級內存,一級文件)

Bitmap緩存

未解碼圖片的內存緩存

文件緩存

Android5.0以前bitmap是緩存在ashmem(共享內存)里。

Android5.0及以上保存在java堆里。

為了釋放bitmap, fresco定義了引用計數(shù)類SharedPrefrence,計數(shù)為0,則回收。

GenericDraweeHierarchy 層級結構

Hierarchy是樹形結構

占位圖

真實圖

進度圖

重試圖

失敗圖

覆蓋層圖

參考資料

Fresco開源:https://mp.weixin.qq.com/s/uNCWHYZi3M4khR2414FvKA

Fresco 內存回收:http://blog.csdn.net/brycegao321/article/details/52440640

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • 赤焰軍少帥林殊閱讀 358評論 0 0
  • 晚上吃了衢州特色點心,開心的 看了開心麻花的我是白小飛,笑的很high。 喜歡這么開心的自己 雖然心里還是空空的,...
    英子_b3c9閱讀 191評論 0 0
  • 課程結束就交圖的即時記錄,必須上頭條哈!雖然聽完課后發(fā)現(xiàn)很多地方中槍了,但正因為這次錯了,記憶才會更深刻哈。 “當...
    Elian一蓮閱讀 2,407評論 0 1
  • 明天要參加部門的第一次活動。其實我是很想回家的,因為工作很忙,我已經(jīng)有一個月沒有回家了,非常想念家里的小寶寶,但是...
    煙澀寒閱讀 101評論 0 0

友情鏈接更多精彩內容