Android开发-开源图片库Picasso的使用

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进行任务分发;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值