Picasso
Picasso是Square公司出品的一款非常优秀的开源图片加载库,是目前Android开发中超级流行的图片加载库之一,今天我们就来分析下他的使用及实现流程。
使用简介
首先在项目中引入picasso(以gradle为例)
compile 'com.squareup.picasso:picasso:2.5.2'
传统的ImageVIew设置图片
Picasso.with(context).load(url).placeholder(R.drawable.tab_item_bg).into(imageView);
自定义的布局设置图片,target是指实现了Target接口的自定义View
Picasso.with(context).load(url).placeholder(R.drawable.tab_item_bg).into(target);
adapter中的使用
//View复用会自动察觉并且取消之前的下载任务
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
自动设置图片宽高像素的大小
Picasso
.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
流程分析
接下来我们就以上面的链式调用来分析Picasso的实现流程,首先来认识几个类
RequestHandler
//抽象类,由不同的子类来实现不同来源的图片的获取与加载,比如:
//AssetRequestHandler:加载asset里的图片
//FileRequestHandler:加载硬盘里的图片
//ResourceRequestHandler:加载资源图片
//NetworkRequestHandler:加载网络图片
BitmapHunter
//是一个Runnable的子类,用来进行Bitmap的获取(网络,硬盘,内存等),处理(角度,大小等),
//然后执行分发器(dispatcher)的回调处理
PicassoDrawable
//实现了引入图片渐变功能和debug状态的标识的Drawable,用来在最后bitmap转换成PicassoDrawable
//然后设置给ImageView,根据图片的来源可以在图片的左上角显示一个不同颜色的三角形色块
MEMORY(Color.GREEN) //内存加载
DISK(Color.BLUE) //本地加载
NETWORK(Color.RED) //网络加载
DeferredRequestCreator
//ViewTreeObserver.OnPreDrawListener的实现类,即将绘制视图树时执行的回调函数。
//这时所有的视图都测量完成并确定了框架。 客户端可以使用该方法来调整滚动边框,
//甚至可以在绘制之前请求新的布局,这里用来实现当开发者修改图片尺寸时的逻辑
Action
//Action代表了一个具体的加载任务,主要用于图片加载后的结果回调,有两个抽象方法,complete和error,
//并保存了每个请求的各种信息(),具体的实现类如下
//GetAction:同步执行请求时使用。
//FetchAction:当不需要ImageView来安置bitmap时的异步请求,通常用来预热缓存
//RemoteViewsAction:用来更新远程图片(notification等)的抽象类。
//TargetAction:一般在View(不只是ImageView)或者ViewHolder中用来加载图片,需要实现Target接口
//ImageViewAction:最常用的Action,主要用来给ImageView加载图片
流程分析
1. Picasso对象的创建
//通过Picasso的一个静态内部类Builder来创建本身的对象(单例)
//这种构建方式在很多的流行开源库中都在使用,可以借鉴
public static Picasso with(Context context) {
if (singleton == null) {
synchronized (Picasso.class) {
if (singleton == null) {
singleton = new Builder(context).build();
}
}
}
return singleton;
}
public Picasso build() {
Context context = this.context;
//下载器
if (downloader == null) {
downloader = Utils.createDefaultDownloader(context);
}
//Lru缓存
if (cache == null) {
cache = new LruCache(context);
}
//线程池,核心线程数为3,使用优先队列
if (service == null) {
service = new PicassoExecutorService();
}
//请求的前置处理,在请求发出去之前执行,类似于拦截器
if (transformer == null) {
transformer = RequestTransformer.IDENTITY;
}
//状态控制类,用来发送各种消息,例如查找图片缓存的结果(击中/未击中),下载完成等
Stats stats = new Stats(cache);
//分发器,用来分发任务
Dispatcher dispatcher = new Dispatcher(
context, service, HANDLER, downloader, cache, stats);
//返回一个Picasso对象
return new Picasso(context, dispatcher, cache, listener, transformer, requestHandlers, stats, defaultBitmapConfig, indicatorsEnabled, loggingEnabled); }} |