Fresco 出身名门,功能强大,应该是目前来说最为牛逼的图片加载框架。
内存管理:图片解压后,Bitmap会占据大量内存,在5.0以下的系统中会引发系统大量的GC操作,GC操作会引起界面卡顿,Fresco把Bitmap放在AshMem 匿名共享内存中,这样就不会引起GC.并且图片不显示的时候,占用的内存会被释放。
PipeLine:主要是起到了一个图片加载的功能,大概的流程如下 先看内存中是否有Bitmap如果有的话就直接使用,如果没有就看内存中有没有未解压的图片存在,如果有解压后,返回一个Bitmap对象然后把Bitmap写进内存中去。没有的话就去看磁盘,磁盘没有再去下载。三级缓存,两级内存一级磁盘。第一级缓存就是保存bitmap,第二级缓存保存在内存,但是没有解码,使用时需要界面,第三级缓存就是保存在本地文件,同样文件也未解码,使用的时候要先解码啦!
Drawees:
负责图片的呈现。它由三个元素组成分别是:
DraweeView 继承于 View, 负责图片的显示。
DraweeHierarchy 用于组织和维护最终绘制和呈现的 Drawable 对象。
DraweeController 负责和ImagePipeline的交互,可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。
Fresco的支持WEBP的显示,和Gif动画以及WEBP动图的显示。
gif图片,其实跟显示图片没什么差,主要是动态图片涉及到的动画的停止与播放,如果只是单纯的试用一下,那就直接在controller里面设置setAutoPlayAnimation为true,如果你想手动监听就new一个ControllerListener里面手动控制
当我们要从服务器端下载一张高清图片,图片比较大,下载很慢的情况下有些服务器会提供一张缩略图,同样的Fresco也支持这种方法,在controller中提供了两个不同的方法setLowResImageRequest和setImageRequest,看到方法名你应该明白了怎么用
上面谈到的保存的很多内容都未解码,这也是fresco默认使用3个线程的原因,一个线程用来加载uri,一个线程用来解码,最后一个你知道它做什么,其余你想了解的东西自己去官网找找。