Fresco 原理浅析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fresco 原理浅析相关的知识,希望对你有一定的参考价值。
参考技术A 目录什么是fresco?
为什么要设计fresco?
fresco有什么特性?
fresco的架构原理
内存机制
GenericDraweeHierarchy 层级结构
参考资料
什么是Fresco?
官网 https://www.fresco-cn.org
github https://github.com/facebook/fresco
为什么要设计Fresco?
FaceBook 说的如下:
对于android平台的Facebook来说,快速而高效的展示图片是很重要的。不过近年来,我们在如何高效地存储图片方面遇到了很多问题。图片所需空间很大,而设备上空间很小。每个像素占用4个字节,分别为红、绿、蓝和α透明度。如果一个手机的屏幕尺寸是480*800像素,一张全屏的图片就占用1.5MB的内存。通常手机的内存很少,并且Android设备在众多应用程序之间会平均分配自身的内存。在一些设备上,Facebook程序内存被限制在16MB,可是仅仅一张图片就占用了十分之一!
当你的应用程序运行超出内存时会发生什么?它会crash。我们打算通过创建我们称之为Fresco的库来解决这个问题。它能管理图片及其所占内存,Crash便随之消失了。
总结:就是处理图片OOM问题,对图片做内存管理。
Fresco有什么特性?
内存管理
图片加载
图片绘制
图片的渐进式呈现
动图加载
Fresco架构原理
栗子:
ControllerListenerlistener = newBaseControllerListener()...DraweeControllercontroller =Fresco.newDraweeControllerBuilder() .setUri(uri) .setTapToRetryEnabled(true) .setOldController(mSimpleDraweeView.getController()) .setControllerListener(listener) .build();mSimpleDraweeView.setController(controller);
弄懂fresco的架构原理,需要知道
fresco是如何获取图片数据?
获取到的图片数据是如何显示的?
SimpleDraweeViewAbstractDraweeControllerBuilderPipelineDraweeControllerPipelineDraweeControllerBuilderImagePipelineProducerSequenceFactoryNetworkFetchProducerConsumerMemoryCacheDraweeHolderAbstractDraweeControllerAbstractDataSourceAbstractDraweeController.DataSubscriberGenericDraweeHierarchyForwardingDrawableSimpleDraweeViewinitsetImageURIbuildbuildControllerobtainControllerobtainDataSourceSuppliergetDataSourceSupplierForRequestgetDataSourceForRequestfetchDecodedImagegetDecodedImageProducerSequencegetBasicDecodedImageSequence(uri的区别对待)getNetworkFetchSequence(走网络)getCommonNetworkFetchToEncodedMemorySequence(encoded cache -> disk cache -> (webp transcode) -> network fetch)reurn ProductersubmitFetchRequestproduceResults(从网络上获取数据)notifyConsumer(转化成encodeimage 给消费者消费)onNewResultImpl()cachesetController(设置图片)attachControlleronAttachsubmitRequestgetCachedImagegetCachedImage(return cache image)subscribe(注册监听)notifyDataSubscriber(ui线程,通知监听者)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 获取数据阶段
9-12:set data 设置图片阶段
内存机制
三级缓存(两级内存,一级文件)
Bitmap缓存
未解码图片的内存缓存
文件缓存
Android5.0以前bitmap是缓存在ashmem(共享内存)里。
Android5.0及以上保存在java堆里。
为了释放bitmap, fresco定义了引用计数类SharedPrefrence,计数为0,则回收。
GenericDraweeHierarchy 层级结构
Hierarchy是树形结构
占位图
真实图
进度图
重试图
失败图
覆盖层图
参考资料
Fresco开源: https://mp.weixin.qq.com/s/uNCWHYZi3M4khR2414FvKA
Fresco 内存回收: http://blog.csdn.net/brycegao321/article/details/52440640
海明码原理浅析
以上是关于Fresco 原理浅析的主要内容,如果未能解决你的问题,请参考以下文章