Fresco 原理浅析

目录

什么是fresco?

为什么要设计fresco?

fresco有什么特性?

fresco的架构原理

内存机制

GenericDraweeHierarchy 层级结构

参考资料

什么是Fresco?

官网https://www.fresco-cn.org

githubhttps://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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,327评论 25 709
  • 赤焰军少帅林殊阅读 2,394评论 0 0
  • 晚上吃了衢州特色点心,开心的 看了开心麻花的我是白小飞,笑的很high。 喜欢这么开心的自己 虽然心里还是空空的,...
    英子_b3c9阅读 1,131评论 0 0
  • 课程结束就交图的即时记录,必须上头条哈!虽然听完课后发现很多地方中枪了,但正因为这次错了,记忆才会更深刻哈。 “当...
    Elian一莲阅读 6,004评论 0 1
  • 明天要参加部门的第一次活动。其实我是很想回家的,因为工作很忙,我已经有一个月没有回家了,非常想念家里的小宝宝,但是...
    烟涩寒阅读 789评论 0 0