Picasso 是由 Square 公司开发的用于在 Android 应用中加载图片的库。该库提供了简单而富有表现力的 API,用于从网络加载、缓存和显示图形。根据 Picasso 的 GitHub 统计数据,该库已被下载 超过 100,000 次。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 由两个层级组成:用于快速访问的 RAM 和用于永久存储的磁盘。在请求图片时,库首先检查内存缓存,然后是磁盘,最后才执行网络请求。这显著加快了重复加载图片的显示速度。
变换 允许在不每次解码原始图片的情况下调整大小、裁剪或旋转图片。Picasso 提供了内置的 CenterCrop 和 CenterInside 变换,还允许通过 Transformation 接口创建自定义变换。变换后的图片会被单独缓存。
占位图 在从网络加载图片时显示,为用户提供视觉反馈。错误图在加载失败时显示。Picasso 还支持在加载新版本前显示的图片,这对于可更新的头像非常有用。
Picasso 支持从 URL、资源、文件、内容提供者和 URI 加载图片。load() 方法对所有这些类型进行了重载,库会自动确定来源。对于资源和文件,Picasso 不执行网络请求,而是直接加载数据,这加速了内置图形的显示。
Picasso 使用基于 RequestCreator 和 Dispatcher 的架构。每个请求通过 Picasso.get().load() 创建并在线程池中执行。Dispatcher 管理请求队列、优先级以及在 ImageView 重用时的请求取消。
调用 into(view) 时,Picasso 创建一个 Action 对象,其中包含 URL、变换、target 和回调。Action 被放入 Dispatcher 的队列中。引擎通过 Downloader(默认为 OkHttp)加载图片,解码 Bitmap,应用变换并将结果返回到 UI 线程。所有图片会自动适应 ImageView 的大小。
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
安装 Picasso 通过 Gradle 完成。该库通过 Maven Central 分发,不需要复杂的配置。最低 Android API 版本为 21。
在模块级别的 build.gradle 文件中,添加 implementation 'com.squareup.picasso:picasso:2.8'。Gradle 同步后,Picasso 即可使用。对于网络操作,Picasso 会自动使用项目中的 OkHttp(如果存在)或内置的 HttpURLConnection。
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 的典型场景:加载简单图片、使用变换和在 RecyclerView 中加载。
基本的 加载 到 ImageView 通过一次调用完成。Picasso 会自动根据 scaleType 将图片调整到视图的尺寸。Placeholder 在加载完成前显示,error 在连接错误时显示。
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
变换 BlurTransformation 使用指定的半径模糊图片。自定义变换通过 transform 方法实现 Transformation 接口。缓存将变换结果保存在唯一键下,以避免重复应用。
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 中,Picasso 会自动取消已离开屏幕的 ImageView 的请求,并重用已加载的图片。这防止了内存泄漏并确保了平滑滚动。
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
对比 Picasso 和 Glide 是在选择 Android 图片加载库时的常见问题。两个库解决相同的任务,但具有不同的优先级和使用特点。
Picasso 更适合 简单性 和最小 APK 大小重要的项目。当需要 GIF 支持、视频帧和最大内存优化时,会选择 Glide。Glide 会自动将图片缩放到 ImageView 的精确大小,在某些场景下相比 Picasso 可减少高达 50% 的内存消耗。
根据性能测试,Glide 在处理 RecyclerView 时表现 更好,这得益于预加载机制和快速滚动时的自动请求取消。Picasso 使用更简单的策略,使其可预测但在大数据量下效率较低。
Picasso 专注于 API 简单性 和最小体积。Glide 提供更广泛的功能:支持 GIF、动画图片、视频帧和生命周期集成。由于自动缩放到 ImageView 大小,Glide 的内存管理也更高效。
| 标准 | Picasso | Glide |
|---|---|---|
| 库大小 | ~120 KB | ~500 KB |
| GIF 支持 | 否 | 是 |
| 视频帧 | 否 | 是 |
| 开发者 | Square | Google (Bumptech) |
| API | Fluent 链式 | RequestBuilder |
根据 Android Developer Relations,Google 推荐 Glide 作为新项目中图片加载的首选库。Picasso 仍然是简单项目的优秀选择,适用于不需要 GIF 和视频帧的场景。
常见问题
Picasso 体积更小,使用更简单。Glide 支持 GIF 和视频帧,更有效地管理内存,并被 Google 推荐。选择取决于项目对额外格式的需求。
要 清除 Picasso 的缓存,对单个图片使用 Picasso.get().invalidate(url) 方法,或使用 shutdown() 进行完全清除。磁盘缓存在重新安装应用时或通过系统设置删除。
Picasso 不依赖于屏幕旋转。加载的图片保存在缓存中,在 Activity 重新创建时从缓存显示。为了加速,可以将 ViewModel 与 Picasso 结合使用来保存加载的数据。
可以,Picasso 与 Kotlin 完全兼容。Kotlin 开发者可以使用扩展函数编写更简洁的语法,或应用 koptional 库来处理图片加载时的空值。
Picasso 使用 LruCache 进行内存缓存,自动清理未使用的图片。默认缓存大小为应用可用内存的 15%。内存不足时,Picasso 通过 onTrimMemory 释放资源。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。