Android之Fresco框架(三)--ImagePipeline的Producer

上一篇主要是讲到了ImagePipelineFactory和ImagePipelineConfig里面的基本内容和配置。这篇来介绍一下ImagePipeline里面很重要的一个部分:Producer

责任链模式与Pipeline

引用《Java与模式》里面对责任链(Chain of Responsibility)模式的介绍:

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

我们再贴一下上一篇用过的一张图:


是不是感觉跟上面所讲的责任链模式的概念很像。我们再发出请求之后,会经由DecodedMemoryCache ->EncodedMemoryCache->DiskCache->Network,在这个过程中,一旦有一个能够找到我们想要的图片资源,就会将其返回,如果没有,则交给下一个对象去处理。如果把请求比作水,每个处理对象比作阀门,这也很像是一个管道,每个阀门判断是否要将水进行拦截,然后将处理完的结果返回。所以用pipeline来形容也是很形象的(自我感觉)。说到这里,其实这个跟OkHttp里面的interceptor有些相似之处。

这里面的每个“阀门”的实现,用的就是ImagePipeline里面的Producer,而整个管道的实现,用的就是ImagePipeline里面的ProducerSequence了。

Producer

Fresco里面定义了很多的Producer,而且在里面有些Producer也有相对应的Consumer,用于对数据进行相应的操作,例如更新内存,对图片进行裁剪,压缩等等。Producer与Producer之间有类似于嵌套的操作,Consumer与Consumer之间也有,因为一个图片被这个Consumer处理完之后,还要传给下一个Consumer进行处理。这块Producer的类有点多。就按照我们之前讲的的,MemeryCache->EncodedMemoryCache->DiskCache->网络,这个流程来讲吧,Procuder顺序就是按照下面表格的顺序从上往下来的,Consumer的顺序是从下往上。

Producer 功能 Consumer
PostprocessedBitmap-MemoryCacheProducer 在MemoryCache中查找被postprocess的数据 将上一个Consumer传来的result存到MemoryCache
PostprocessProducer 如果需要postpocess,对获取到的图片进行postprocess 在线程池中将上一个Consumer传来的result进行postprocess处理
BitmapMemoryCacheGetProducer 判断数据是否在缓存中且满足最低请求级别(继承于BitmapMemoryCacheProducer) 无Consumer
ThreadHandoffProducer 将接下来的Producer的操作放在线程池中(避免在UI线程中操作) 无Consumer
BitmapMemoryCacheProducer 判断数据是否在缓存中且满足最低请求级别 判断是否要对上一个Consumer传来的result进行存储
DecodeProducer 判断在Consumer中需要采用那种类型的decoder 对上一个Consumer传来的result进行decode
ResizeAnd-RotateProducer 添加自身的Consumer 根据设置的参数判断是否需要对result进行修改
AddImageTransformMetaDataProducer 添加自身的Consumer 判断是否需要设置encoded image的源数据
EncodedCacheKeyMultiplexProducer 将多个相同的请求合成到一个请求中,并将相应的Consumer存在multiplexer里的set中 将BaseConsumer的方法传给Multiplexer

EncodedMemoryCacheProducer

判断数据是否在EncodedMemoryCache中 根据参数决定是否要存储数据
DiskCacheReadProducer 判断BufferedDiskCache中是否由相应内容,如果有就返回给Consumer 无Consumer
DiskCacheWriteProducer 根据参数决定是否要添加自身的CacheWriteComsumer 将数据写入磁盘存储中
WebpTranscodeProducer 添加自身的Consumer 如果传来的result中是WebP,进行解码
NetworkFetchProducer
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值