仅为自己学习归纳
Image Pipeline
Fresco官方缓存图示
大致流程如下:
- 寻找内存缓存(Bitmap Cache)中是否有图片,有着返回,无则继续寻找。
- 后台线程开始工作。
- 寻找未解码缓存中是否有图片,如有,解码,变换,返回。然后将其缓存在内存缓存中。
- 寻找磁盘缓存中是否有图片,如有,解码,变换,返回。然后将其缓存到未解码缓存和内存缓存中。
- 从网络和本地加载图片,加载后解码,变换,返回。然后将其缓存到各个缓存中去。
上图中,disk cache实际包含了未解码的内存缓存在内,统一在一起只是为了逻辑稍微清楚一些。
关于disk cache
的官方解释:
理解缓存图示Yes, we know phones don’t have disks, but it’s too tedious to keep saying local storage cache
Image Pipeline默认有3个线程池:
- 3个线程用于网络下载。
- 2个线程用于磁盘操作:本地文件的读取,磁盘缓存的操作。
- 2个线程用于CPU相关的操作:解码,变换,以及后出来等后台操作。
三级缓存
1.Bitmap缓存
Bitmap缓存储存Bitmap
对象,这些Bitmap对象可以立刻用来显示或者用于后处理
在5.0以下系统,BItmap缓存位于ashmem
,这样Bitmap对象的创建和释放将不会一发GC(Gabage Collection),更少的GC会使APP更加流畅。
5.0及其以上系统,内存管理有了很大的改进,所以Bitmap缓存直接位于Jav啊的heap(堆内存)上
当应用在后台运行时,该内存会被清空。
ashmem:匿名共享内存
未解码图片的内存缓存
这个缓存存储的时原始压缩格式的图片。从该缓存取到的图片在使用之前,需要先进行解码。
如果有调整大小,旋转,或者WebP编码工作需要完成,这些工作会在解码之前进行。
磁盘缓存
和未解码的内存缓存相似,磁盘缓存储存的时未解码的原始压缩格式的图片,在使用之前同样需要解码等处理。
和其他的不一样,磁盘缓存在后台时,不会被清空,即使设备关闭,不过用户可以随时进入系统菜单进行清空缓存操作。
网友评论