Picasso:是什么,图片加载及在 Android 应用中的使用

作者: IT Sectr 发布日期: 2026-05-05 阅读时间: 8 分钟

Picasso 是由 Square 公司开发的用于在 Android 应用中加载图片的库。该库提供了简单而富有表现力的 API,用于从网络加载、缓存和显示图形。根据 Picasso 的 GitHub 统计数据,该库已被下载 超过 100,000 次。Picasso 自动管理内存并在多个层级缓存图片。

要点

  • Picasso — Square 出品的图片加载库,提供适用于 Android 的简单 API
  • 缓存 在磁盘和内存中,减少重复图片的加载时间
  • 变换 Crop、Resize 和 Rotate 可即时应用于图片
  • 占位图 和错误图在加载期间和出错时显示
  • 加载优先级 允许管理图片的显示顺序

什么是 Picasso?

Picasso 是一个用于在 Android 中异步加载图片的库,由 Square 公司创建。其名称来源于艺术家巴勃罗·毕加索,反映了该库的理念:将复杂的任务转化为简单优雅的 API。这是 Android 社区中最流行的图片加载库。

Picasso 的架构是 极简 的:该库使用线程池进行加载,使用 LruCache 进行内存缓存,使用 DiskLruCache 进行磁盘缓存。与 Glide 不同,Picasso 不需要配置 AppGlideModule,添加依赖后即可使用。这使其成为原型和小型项目的理想选择。

Picasso 2.8 — 最后一个稳定版本,兼容 Android API 21+ 和 Java 8+。该库不需要 配置 Gradle 插件或注解,这简化了版本之间的迁移并降低了更新时出错的风险。尽管历史悠久,Picasso 在全球数千个项目中仍被广泛使用。

Picasso 的主要任务是从 URL 加载图片、解码、必要时调整大小并在 ImageView 中显示。该库自动管理后台线程、缓存以及列表中 ImageView 的复用。

自 2013 年发布以来,Picasso 已成为 Android 社区中图片加载的标准。该库被用于数千个应用,因为其入门门槛极低 — 首次使用只需一行代码。

优先级和请求取消

优先级 在 Picasso 中允许管理图片的加载顺序。默认情况下,所有请求具有正常优先级,但对于关键图片,可以通过 priority 方法设置高优先级。如果 ImageView 被重用(例如在 RecyclerView 中),Picasso 会自动取消之前的请求并启动新的请求,防止滚动时图片闪烁。

Picasso 的主要功能

Picasso 提供了一套功能,涵盖了移动应用中图片处理的基本场景,没有不必要的复杂性。

多级缓存

缓存 Picasso 由两个层级组成:用于快速访问的 RAM 和用于永久存储的磁盘。在请求图片时,库首先检查内存缓存,然后是磁盘,最后才执行网络请求。这显著加快了重复加载图片的显示速度。

图片变换

变换 允许在不每次解码原始图片的情况下调整大小、裁剪或旋转图片。Picasso 提供了内置的 CenterCrop 和 CenterInside 变换,还允许通过 Transformation 接口创建自定义变换。变换后的图片会被单独缓存。

占位图和错误图

占位图 在从网络加载图片时显示,为用户提供视觉反馈。错误图在加载失败时显示。Picasso 还支持在加载新版本前显示的图片,这对于可更新的头像非常有用。

从不同来源加载

Picasso 支持从 URL、资源、文件、内容提供者和 URI 加载图片。load() 方法对所有这些类型进行了重载,库会自动确定来源。对于资源和文件,Picasso 不执行网络请求,而是直接加载数据,这加速了内置图形的显示。

Picasso 是如何工作的?

Picasso 使用基于 RequestCreator 和 Dispatcher 的架构。每个请求通过 Picasso.get().load() 创建并在线程池中执行。Dispatcher 管理请求队列、优先级以及在 ImageView 重用时的请求取消。

请求架构

调用 into(view) 时,Picasso 创建一个 Action 对象,其中包含 URL、变换、target 和回调。Action 被放入 Dispatcher 的队列中。引擎通过 Downloader(默认为 OkHttp)加载图片,解码 Bitmap,应用变换并将结果返回到 UI 线程。所有图片会自动适应 ImageView 的大小。

java
Picasso.get()
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .resize(400, 300)
    .centerCrop()
    .into(imageView)

Picasso 的安装与配置

安装 Picasso 通过 Gradle 完成。该库通过 Maven Central 分发,不需要复杂的配置。最低 Android API 版本为 21。

添加依赖

在模块级别的 build.gradle 文件中,添加 implementation 'com.squareup.picasso:picasso:2.8'。Gradle 同步后,Picasso 即可使用。对于网络操作,Picasso 会自动使用项目中的 OkHttp(如果存在)或内置的 HttpURLConnection。

groovy
dependencies {
    implementation "com.squareup.picasso:picasso:2.8"
}

// 用于从 OkHttp 加载的 Kafka(可选)
implementation "com.squareup.okhttp3:okhttp:4.12.0"

调试指示器和缓存

调试指示器 Picasso 在每个图片角落显示彩色三角形:红色表示网络加载,蓝色表示磁盘缓存,绿色表示内存缓存。通过在 Picasso 实例上调用 setIndicatorsEnabled(true) 来启用。默认缓存为设备可用内存的 15%。

要配置 自定义 Picasso 实例,请使用 Picasso.Builder。它允许设置用于后台线程的 Executor、用于网络请求的 Downloader、MemoryCache 和 DiskCache。自定义实例在测试中特别有用,可以将 Downloader 替换为返回图片而无需网络请求的桩。

Picasso 使用示例

下面的 示例 展示了使用 Picasso 的典型场景:加载简单图片、使用变换和在 RecyclerView 中加载。

加载图片到 ImageView

基本的 加载 到 ImageView 通过一次调用完成。Picasso 会自动根据 scaleType 将图片调整到视图的尺寸。Placeholder 在加载完成前显示,error 在连接错误时显示。

java
Picasso.get()
    .load("https://example.com/photo.jpg")
    .placeholder(R.drawable.loading)
    .error(R.drawable.broken_image)
    .fit()
    .centerCrop()
    .into(imageView)

应用自定义变换

变换 BlurTransformation 使用指定的半径模糊图片。自定义变换通过 transform 方法实现 Transformation 接口。缓存将变换结果保存在唯一键下,以避免重复应用。

java
public class BlurTransformation implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap blurred = Bitmap.createBitmap(source);
        RenderScript rs = RenderScript.create(context);
        // 应用模糊效果
        source.recycle();
        return blurred;
    }

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

在 RecyclerView 中加载图片

RecyclerView 中,Picasso 会自动取消已离开屏幕的 ImageView 的请求,并重用已加载的图片。这防止了内存泄漏并确保了平滑滚动。

java
public void onBindViewHolder(ViewHolder holder, int position) {
    String url = items.get(position).getImageUrl();
    Picasso.get()
        .load(url)
        .fit()
        .centerCrop()
        .into(holder.imageView);
}

Picasso 还是 Glide:库的对比

对比 Picasso 和 Glide 是在选择 Android 图片加载库时的常见问题。两个库解决相同的任务,但具有不同的优先级和使用特点。

Picasso 更适合 简单性 和最小 APK 大小重要的项目。当需要 GIF 支持、视频帧和最大内存优化时,会选择 Glide。Glide 会自动将图片缩放到 ImageView 的精确大小,在某些场景下相比 Picasso 可减少高达 50% 的内存消耗。

根据性能测试,Glide 在处理 RecyclerView 时表现 更好,这得益于预加载机制和快速滚动时的自动请求取消。Picasso 使用更简单的策略,使其可预测但在大数据量下效率较低。

Picasso 专注于 API 简单性 和最小体积。Glide 提供更广泛的功能:支持 GIF、动画图片、视频帧和生命周期集成。由于自动缩放到 ImageView 大小,Glide 的内存管理也更高效。

标准PicassoGlide
库大小~120 KB~500 KB
GIF 支持
视频帧
开发者SquareGoogle (Bumptech)
APIFluent 链式RequestBuilder

根据 Android Developer Relations,Google 推荐 Glide 作为新项目中图片加载的首选库。Picasso 仍然是简单项目的优秀选择,适用于不需要 GIF 和视频帧的场景。

常见问题

Picasso 与 Glide 有何不同?

Picasso 体积更小,使用更简单。Glide 支持 GIF 和视频帧,更有效地管理内存,并被 Google 推荐。选择取决于项目对额外格式的需求。

如何清除 Picasso 的缓存?

清除 Picasso 的缓存,对单个图片使用 Picasso.get().invalidate(url) 方法,或使用 shutdown() 进行完全清除。磁盘缓存在重新安装应用时或通过系统设置删除。

Picasso 如何处理屏幕旋转?

Picasso 不依赖于屏幕旋转。加载的图片保存在缓存中,在 Activity 重新创建时从缓存显示。为了加速,可以将 ViewModel 与 Picasso 结合使用来保存加载的数据。

可以在 Kotlin 中使用 Picasso 吗?

可以,Picasso 与 Kotlin 完全兼容。Kotlin 开发者可以使用扩展函数编写更简洁的语法,或应用 koptional 库来处理图片加载时的空值。

Picasso 如何管理内存?

Picasso 使用 LruCache 进行内存缓存,自动清理未使用的图片。默认缓存大小为应用可用内存的 15%。内存不足时,Picasso 通过 onTrimMemory 释放资源。

总结

  • Picasso — Square 出品的轻量级图片加载库,API 简洁
  • 缓存 在磁盘和内存中,自动管理大小
  • 变换 CenterCrop、CenterInside 及通过 Transformation 接口自定义
  • 占位图 和错误图提供流畅的用户体验
  • 自动 取消 RecyclerView 中的请求,防止不必要的加载
  • 调试 指示器帮助直观地确定图片来源
  • 库大小 仅 120 KB — 对 APK 大小影响极小

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读