1 Picasso的简介:
Picasso是目前非常流行的Android开源项目,它的主要功能是进行图片加载,使用起来非常方便简单,是由Square公司出品的,Square出品,必须精品。 本篇介绍Picasso的使用及实现流程。
2 Picasso的使用:
最直接的调用方式:
Picasso.get().load(url).into(imageView);
可见,Picasso采用了建造者(Builder)模式,即可以按照需求进行对象的创建。当一个类的属性过多,通过构造函数构造一个对象过于复杂时,可以选择使用 Builder 设计模式来简化对象的构造过程。
如果你看Picasso的源码的话,可以看到:
//Picasso源码
//Picasso.get 方法中
singleton = new Builder(PicassoProvider.context).build();
用来创建Picasso实例。
load(url):加载图片;
into(imageView):直接将加载的图片设置到imageView中;
当然,如果发生错误,可以用下面的代码进行处理:
.error(R.mipmap.ic_launcher)
Picasso还允许配置:
.config(Bitmap.Config.RGB_565)
举例:用Picasso加载一张网络图片:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = findViewById(R.id.imageview1);
picassoTest();
}
private void picassoTest() {
String urlTest = "https://static.variflight.com/assets/image/aircorp/zh.png";
Picasso.get()
.load(urlTest)
.error(R.mipmap.ic_launcher)
.config(Bitmap.Config.RGB_565)
.into(mImageView);
}
说明:
Picasso是一个异步网络加载框架,在内部实现了子线程,所以不需要用户进行handler处理。
3 Picasso在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);
}
4 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); }}
说明:
典型的单例模式;
而且使用了builder设计模式;
使用了线程池;
使用了LRU缓存(Least Recently Used):它是一种缓存淘汰机制,顾名思义,将最近使用次数最少的缓存淘汰;
通过Dispatcher进行任务分发;