Picasso es una biblioteca para cargar imágenes en aplicaciones Android, desarrollada por Square. La biblioteca proporciona una API simple y expresiva para cargar, almacenar en caché y mostrar gráficos desde la red. Según las estadísticas de Picasso en GitHub, la biblioteca se ha descargado más de 100 000 veces. Picasso gestiona automáticamente la memoria y almacena imágenes en caché en múltiples niveles.
Puntos clave
Picasso es una biblioteca para la carga asincrónica de imágenes en Android, creada por Square. Recibió su nombre en honor al artista Pablo Picasso, reflejando la filosofía de la biblioteca: convertir una tarea compleja en una API simple y elegante. Es la biblioteca más popular para la carga de imágenes en la comunidad Android.
La arquitectura de Picasso es minimalista: la biblioteca utiliza un pool de hilos para la carga, LruCache para la caché en memoria y DiskLruCache para la caché en disco. A diferencia de Glide, Picasso no requiere configuración de AppGlideModule y está listo para usar inmediatamente después de agregar la dependencia. Esto lo convierte en una opción ideal para prototipos y proyectos pequeños.
Picasso 2.8 es la última versión estable, compatible con Android API 21+ y Java 8+. La biblioteca no requiere configuración de complementos de Gradle ni anotaciones, lo que simplifica la migración entre versiones y reduce la probabilidad de errores durante las actualizaciones. A pesar de su larga trayectoria, Picasso sigue siendo demandado en miles de proyectos en todo el mundo.
La tarea principal de Picasso es cargar una imagen por URL, decodificarla, cambiar su tamaño si es necesario y mostrarla en un ImageView. La biblioteca gestiona automáticamente los hilos en segundo plano, la caché y la reutilización de ImageView en listas.
Desde su lanzamiento en 2013, Picasso se ha convertido en el estándar para la carga de imágenes en la comunidad Android. La biblioteca se utiliza en miles de aplicaciones gracias a su mínimo umbral de entrada — solo se necesita una línea de código para el primer uso.
Las prioridades en Picasso permiten gestionar el orden de carga de las imágenes. Por defecto, todas las solicitudes tienen prioridad normal, pero para imágenes críticas se puede establecer una prioridad alta mediante el método priority. Si un ImageView se reutiliza (por ejemplo, en RecyclerView), Picasso cancela automáticamente la solicitud anterior e inicia una nueva, evitando el parpadeo de imágenes durante el desplazamiento.
Picasso ofrece un conjunto de funciones que cubren los principales escenarios de trabajo con imágenes en aplicaciones móviles sin complejidad innecesaria.
La caché de Picasso consta de dos niveles: RAM para acceso rápido y disco para almacenamiento permanente. Al solicitar una imagen, la biblioteca primero verifica la caché en memoria, luego el disco y solo entonces realiza una solicitud de red. Esto acelera significativamente la visualización de imágenes cargadas repetidamente.
Las transformaciones permiten cambiar el tamaño, recortar o rotar una imagen sin decodificar el original cada vez. Picasso proporciona transformaciones integradas CenterCrop y CenterInside, y también permite crear transformaciones personalizadas a través de la interfaz Transformation. Las imágenes transformadas se almacenan en caché por separado.
El placeholder se muestra mientras se carga la imagen desde la red, dando al usuario una retroalimentación visual. La imagen de error se muestra cuando falla la carga. Picasso también admite una imagen que se muestra hasta que se carga una nueva versión, lo que es útil para avatares actualizables.
Picasso admite la carga de imágenes desde URL, recursos, archivos, proveedores de contenido y URI. El método load() está sobrecargado para todos estos tipos, y la biblioteca determina automáticamente la fuente. Para recursos y archivos, Picasso no realiza una solicitud de red, sino que carga los datos directamente, lo que acelera la visualización de gráficos integrados.
Picasso utiliza una arquitectura basada en RequestCreator y Dispatcher. Cada solicitud se crea a través de Picasso.get().load() y se ejecuta en un pool de hilos. El Dispatcher gestiona la cola de solicitudes, las prioridades y la cancelación cuando se reutiliza un ImageView.
Al llamar a into(view), Picasso crea un objeto Action que contiene la URL, las transformaciones, el destino y el callback. Action se coloca en la cola del Dispatcher. El motor carga la imagen a través de Downloader (OkHttp por defecto), decodifica el Bitmap, aplica las transformaciones y entrega el resultado al hilo de la UI. Todas las imágenes se ajustan automáticamente al tamaño del ImageView.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
La instalación de Picasso se realiza a través de Gradle. La biblioteca se distribuye a través de Maven Central y no requiere configuración compleja. La versión mínima de la API de Android es 21.
En el archivo build.gradle del módulo, agregue implementation ‘com.squareup.picasso:picasso:2.8’. Después de la sincronización de Gradle, Picasso está listo para usar. Para las operaciones de red, Picasso utiliza automáticamente OkHttp si está presente en el proyecto, o el HttpURLConnection integrado.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka para carga desde OkHttp (opcional)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
El indicador de depuración de Picasso muestra un triángulo de color en la esquina de cada imagen: rojo para carga de red, azul para caché en disco, verde para caché en memoria. Se activa llamando a setIndicatorsEnabled(true) en la instancia de Picasso. El tamaño de caché predeterminado es el 15% de la memoria disponible del dispositivo.
Para configurar una instancia personalizada de Picasso, use Picasso.Builder. Permite establecer un Executor para hilos en segundo plano, un Downloader para solicitudes de red, MemoryCache y DiskCache. Una instancia personalizada es especialmente útil en pruebas, donde se puede sustituir el Downloader por un stub que devuelve una imagen sin solicitud de red.
Los ejemplos a continuación demuestran escenarios típicos de trabajo con Picasso: carga de una imagen simple, uso de transformaciones y carga en RecyclerView.
La carga básica en un ImageView se realiza con una sola llamada. Picasso ajusta automáticamente la imagen a las dimensiones de la vista teniendo en cuenta scaleType. Se muestra un placeholder hasta que se completa la carga, y una imagen de error cuando ocurre un error de conexión.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
BlurTransformation difumina la imagen con un radio determinado. Las transformaciones personalizadas implementan la interfaz Transformation con el método transform. La caché almacena el resultado de la transformación bajo una clave única para evitar volver a aplicarla.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// aplicación de desenfoque
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
En RecyclerView, Picasso cancela automáticamente las solicitudes para los ImageViews que han salido de la pantalla y reutiliza las imágenes ya cargadas. Esto evita fugas de memoria y garantiza un desplazamiento suave.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
La comparación de Picasso y Glide es una pregunta frecuente al elegir una biblioteca de carga de imágenes para Android. Ambas bibliotecas resuelven la misma tarea pero tienen diferentes prioridades y características de uso.
Picasso es más adecuado para proyectos donde la simplicidad y el tamaño mínimo del APK son importantes. Glide se elige cuando se necesita soporte para GIF, fotogramas de video y máxima optimización de memoria. Glide escala automáticamente la imagen al tamaño exacto del ImageView, lo que reduce el consumo de memoria hasta un 50% en comparación con Picasso en algunos escenarios.
En las pruebas de rendimiento, Glide muestra mejores resultados al trabajar con RecyclerView gracias a su mecanismo de precarga y cancelación automática de solicitudes durante el desplazamiento rápido. Picasso utiliza una estrategia más simple, lo que lo hace predecible pero menos eficiente en grandes volúmenes de datos.
Picasso se centra en la simplicidad de la API y el tamaño mínimo. Glide ofrece una funcionalidad más amplia: soporte para GIFs, imágenes animadas, fotogramas de video e integración con el ciclo de vida. Glide también gestiona la memoria de manera más eficiente gracias al escalado automático al tamaño del ImageView.
| Criterio | Picasso | Glide |
|---|---|---|
| Tamaño de la biblioteca | ~120 KB | ~500 KB |
| Soporte GIF | No | Sí |
| Fotogramas de video | No | Sí |
| Desarrollador | Square | Google (Bumptech) |
| API | Cadena fluida | RequestBuilder |
Según Android Developer Relations, Glide es recomendado por Google como la biblioteca preferida para la carga de imágenes en nuevos proyectos. Picasso sigue siendo una excelente opción para proyectos simples donde no se necesitan GIFs ni fotogramas de video.
Preguntas frecuentes
Picasso es más pequeño en tamaño y más fácil de usar. Glide admite GIFs y fotogramas de video, gestiona la memoria de manera más eficiente y es recomendado por Google. La elección depende de la necesidad del proyecto de formatos adicionales.
Para limpiar la caché de Picasso, use el método Picasso.get().invalidate(url) para una sola imagen o shutdown() para una limpieza completa. La caché en disco se elimina al reinstalar la aplicación o a través de la configuración del sistema.
Picasso no depende de la rotación de pantalla. Las imágenes cargadas se almacenan en la caché y se muestran desde ella cuando se recrea la Activity. Para acelerar, use ViewModel junto con Picasso para conservar los datos cargados.
Sí, Picasso es completamente compatible con Kotlin. Los desarrolladores de Kotlin pueden usar funciones de extensión para una sintaxis más concisa o aplicar la biblioteca koptional para manejar valores nulos al cargar imágenes.
Picasso utiliza LruCache para la caché en memoria, limpiando automáticamente las imágenes no utilizadas. El tamaño de caché predeterminado es el 15% de la memoria disponible de la aplicación. Cuando la memoria es escasa, Picasso libera recursos a través de onTrimMemory.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también