上一篇主要是讲到了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 | 进 |