移动APP

#Android# Picasso,始终专注图片加载

知识框架(脑图)

Picasso脑图

出现背景

  • 多图加载和性能之间的平衡
  • 考虑网络请求、缓存和开发效率

解决思路

封装网络请求、图片加载和缓存,提供链式编程,一行搞定图片加载

优点:

  1. 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。

  2. 使用复杂的图片压缩转换来尽可能的减少内存消耗

  3. 自带内存和硬盘二级缓存功能

具体步骤

(1)引入依赖库

compile 'com.squareup.picasso:picasso:2.5.2'

(2)提供上下文、图片url和ImageView,一行搞定

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

(3)进阶:图片转换

Picasso.with(context)
  .load(url)
  .resize(50, 50)
  .centerCrop()
  .into(imageView)

还可以自定义转换器,然后传递该实例到transform方法

public class CropSquareTransformation implements Transformation {
  @Override public Bitmap transform(Bitmap source) {
    int size = Math.min(source.getWidth(), source.getHeight());
    int x = (source.getWidth() - size) / 2;
    int y = (source.getHeight() - size) / 2;
    Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
    if (result != source) {
      source.recycle();
    }
    return result;
  }

  @Override public String key() { return "square()"; }
}

(3)进阶:使用占位图,在图片未加载、图片加载出错的时候显示

Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
    .into(imageView);

error placeholder会在请求三次后才显示

(4)进阶:加载Resources、assets、files和content providers中的图片

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);

(5)进阶:开启调试用的指示器

setIndicatorsEnabled(true);

红色代表Network,蓝色代表Disk,绿色代表Memory

调试用的指示器

Q&A

问题1:Picasso相比于Volley有什么优点?

专注于图片加载、缓存,可以加载任何渠道的图片,提供链式编程,一行代码搞定图片加载;相比之下Volley提供的是一种通用的解决方案,不仅仅是加载图片

参考文档

  1. picasso-强大的Android图片下载缓存库
  2. Picasso
  3. Solving the Android image loading problem Volley vs Picasso
  4. Picasso源代码分析:1、跟随代码的角度,当我们添加了一个任务,到底发生了什么?
  5. Android 开源项目源码解析
  6. Picasso源代码分析:5、Picasso架构分析

发表评论