Android图片加载利器之图片加载利器之Picasso源码解析源码解析
看到了这里,相信大家对Picasso的使用已经比较熟悉了,本篇博客中将从基本的用法着手,逐步的深入了解其设计原理。
Picasso的代码量在众多的开源框架中算得上非常少的一个了,一共只有35个class文件,但是麻雀虽小,五脏俱全。好了下面
跟随我的脚步,出发了。
基本用法基本用法
Picasso.with(this).load(imageUrl).into(imageView);
with(this)方法方法
public static Picasso with(Context context) {
if (singleton == null) {
synchronized (Picasso.class) {
if (singleton == null) {
singleton = new Builder(context).build();
}
}
}
return singleton;
}
非常经典的单例模式,双重校验锁
在这多说一句,关于单例模式的实现方式一共有五种,分别是懒汉式,饿汉式,双重校验锁,内部静态类和枚举,其中使用的
最多的就是双重校验锁和内部静态类的两种实现方式,主要优点是程序执行效率高,适应多线程操作。
接下来看下Builder的实现
public static class Builder {
private final Context context;
private Downloader downloader;
private ExecutorService service;
private Cache cache;
private Listener listener;
private RequestTransformer transformer;
private List<RequestHandler> requestHandlers;
private Bitmap.Config defaultBitmapConfig;
private boolean indicatorsEnabled;
private boolean loggingEnabled;
/**
* 根据context获取Application的context
* 此方式主要是为了避免context和单例模式的生命周期不同而造成内存泄漏的问题
*/
public Builder(Context context) {
...
this.context = context.getApplicationContext();
}
/** 设置图片的像素格式,默认为ARGB_8888 */
public Builder defaultBitmapConfig(Bitmap.Config bitmapConfig) {
...
this.defaultBitmapConfig = bitmapConfig;
return this;
}
/** 自定义下载器,默认OkHttp,具体的实现类是OkHttpDownloader */
public Builder downloader(Downloader downloader) {
...
this.downloader = downloader;
return this;
}
/** 自定义线程池,默认的实现是PicassoExecutorService */
public Builder executor(ExecutorService executorService) {
...
this.service = executorService;