Android Picasso 原理解析
另一个常用的图片库Glide的解析,可以参考这篇文章。
一.提供的功能特性
-
使用默认的内存缓存和磁盘缓存(可自定义)
-
可自定义图片的变换操作、解析格式等
-
可以选择裁剪方式、大小等
-
可以加载网络资源、本地资源等
-
可以选择内存缓存和磁盘缓存的策略
-
可以暂停、恢复、取消加载
-
可以设置加载成功失败的占位图及相应监听
二.简单使用
Picasso.with(context)//拿到Picasso对象
.load(url)//load一个url
.resize(width, height)//重新裁剪大小
.memoryPolicy(MemoryPolicy.NO_STORE)//内存缓存策略(不存入内存)
.networkPolicy(NetworkPolicy.OFFLINE)//磁盘缓存策略(不通过网络请求)
.into(imageView);//显示到ImageView中
三.源码结构
1.整体类图
2.内存缓存
-
picasso默认的内存缓存实现是LruCache类,维护一个Lru规则的LinkedList存储key和bitmap
-
默认的缓存大小为堆内存的1/7,约15%
-
我们可以自己实现Cache类来设置到Picasso的全局环境中(下面会提到)
3.磁盘缓存
-
picasso提供了两个磁盘缓存类OkHttpDownloader、UrlConnectionDownloader,在引入OkHttp库时会使用OkHttpDownloader
static Downloader createDefaultDownloader(Context context) { try { Class.forName("com.squareup.okhttp.OkHttpClient"); return OkHttpLoaderCreator.create(context); } catch (ClassNotFoundException ignored) { } return new UrlConnectionDownloader(context); }
-
OkHttpDownloader里面的操作其实是靠OkHttpClient完成,其通过设置headers的一些属性来实现磁盘缓存,HttpUrlConnection也是通过类似方式实现
-
OkHttpClient可以设置其Cache对象,默认为一个DiskLruCache,提供get、put等方法,在使用OkHttpClient请求时,会根据其设置headers属性来决定DiskCache的存取
-
磁盘缓存默认路径为应用的cache文件夹下的picasso-cache文件夹,大小为可用磁盘空间的2%(5~50MB)
-
我们可以自己实现一个Downloader设置到picasso全局环境中(下面会提到),来进行磁盘缓存
4.Picasso对象
下面就来按步骤分析一下picasso加载图片的流程,首先看Picasso.with(context)获取Picasso对象
-
由图可知,Picasso是通过builder模式构建的,Builder类提供一些方法设置全局环境,如BitmapConfig、Downloader、cache等,所以我们可以自己创建这样的builder,并设置相应属性,build后调用setSingletonInstance设置到单例对象上即可
-
默认创建Picasso对象时,使用的是默认的属性,如上面提到的OkHttpDownloader、LruCache等
5.RequestCreator对象
在我们调用load(url)方法后,返回的是一个新的RequestCreator对象,这个对象是包装各种请求参数用的,其相关方法为链式调用
-
RequestCreator对象提供了各种占位图的设置方法以及缓存策略的方法
-
其内部封装了一个Request.Builder对象,用于设置图片相关参数,也是通过builder模式创建;如加载的uri、resize的大小、裁剪方式等,对我们其实是不可见的
6.Action对象
-
由图可知,Action抽象类提供了加载完成后的一些回调方法,不同的实现类用于以不同方式处理加载完成的后续工作,在我们into(iv/target/…)后会构建相应的Act