Picasso là thư viện tải hình ảnh trong các ứng dụng Android, được phát triển bởi Square. Thư viện cung cấp API đơn giản và biểu cảm để tải, lưu vào bộ nhớ đệm và hiển thị đồ hoạ từ mạng. Theo thống kê GitHub của Picasso, thư viện đã được tải xuống hơn 100.000 lần. Picasso tự động quản lý bộ nhớ và lưu hình ảnh vào bộ nhớ đệm ở nhiều cấp độ.
Các điểm chính
Picasso là thư viện tải hình ảnh bất đồng bộ trên Android, được tạo bởi Square. Nó được đặt tên theo danh họa Pablo Picasso, phản ánh triết lý của thư viện: biến một tác vụ phức tạp thành một API đơn giản và thanh lịch. Đây là thư viện phổ biến nhất để tải hình ảnh trong cộng đồng Android.
Kiến trúc của Picasso tối giản: thư viện sử dụng pool luồng để tải, LruCache cho bộ nhớ đệm trong RAM và DiskLruCache cho bộ nhớ đệm trên đĩa. Không giống Glide, Picasso không yêu cầu cấu hình AppGlideModule và sẵn sàng sử dụng ngay sau khi thêm phụ thuộc. Điều này khiến nó trở thành lựa chọn lý tưởng cho các nguyên mẫu và dự án nhỏ.
Picasso 2.8 là phiên bản ổn định mới nhất, tương thích với Android API 21+ và Java 8+. Thư viện không yêu cầu cấu hình plugin Gradle hoặc chú thích, giúp đơn giản hóa việc di chuyển giữa các phiên bản và giảm khả năng xảy ra lỗi khi cập nhật. Mặc dù có lịch sử lâu dài, Picasso vẫn được ưa chuộng trong hàng ngàn dự án trên toàn thế giới.
Nhiệm vụ chính của Picasso là tải hình ảnh qua URL, giải mã, thay đổi kích thước nếu cần và hiển thị trong ImageView. Thư viện tự động quản lý các luồng nền, bộ nhớ đệm và việc sử dụng lại ImageView trong danh sách.
Kể từ khi ra mắt năm 2013, Picasso đã trở thành tiêu chuẩn cho việc tải hình ảnh trong cộng đồng Android. Thư viện được sử dụng trong hàng ngàn ứng dụng nhờ rào cản gia nhập tối thiểu — chỉ cần một dòng mã cho lần sử dụng đầu tiên.
Ưu tiên trong Picasso cho phép quản lý thứ tự tải hình ảnh. Theo mặc định, tất cả các yêu cầu có ưu tiên bình thường, nhưng đối với hình ảnh quan trọng, có thể đặt ưu tiên cao thông qua phương thức priority. Nếu ImageView được sử dụng lại (ví dụ, trong RecyclerView), Picasso tự động hủy yêu cầu trước đó và bắt đầu yêu cầu mới, ngăn chặn hiện tượng nhấp nháy hình ảnh khi cuộn.
Picasso cung cấp một bộ tính năng bao phủ các kịch bản chính khi làm việc với hình ảnh trong ứng dụng di động mà không có sự phức tạp không cần thiết.
Bộ nhớ đệm của Picasso gồm hai cấp: RAM để truy cập nhanh và đĩa để lưu trữ lâu dài. Khi yêu cầu hình ảnh, thư viện đầu tiên kiểm tra bộ nhớ đệm trong RAM, sau đó đĩa, và chỉ sau đó mới thực hiện yêu cầu mạng. Điều này tăng tốc đáng kể việc hiển thị các hình ảnh được tải lặp lại.
Biến đổi cho phép thay đổi kích thước, cắt hoặc xoay hình ảnh mà không cần giải mã bản gốc mỗi lần. Picasso cung cấp các biến đổi tích hợp CenterCrop và CenterInside, và cũng cho phép tạo các biến đổi tùy chỉnh thông qua giao diện Transformation. Các hình ảnh đã biến đổi được lưu vào bộ nhớ đệm riêng.
Placeholder được hiển thị trong khi tải hình ảnh từ mạng, cung cấp phản hồi trực quan cho người dùng. Hình ảnh lỗi được hiển thị khi tải không thành công. Picasso cũng hỗ trợ hình ảnh được hiển thị cho đến khi phiên bản mới được tải, hữu ích cho các ảnh đại diện có thể cập nhật.
Picasso hỗ trợ tải hình ảnh từ URL, tài nguyên, tệp, nhà cung cấp nội dung và URI. Phương thức load() được nạp chồng cho tất cả các loại này và thư viện tự động xác định nguồn. Đối với tài nguyên và tệp, Picasso không thực hiện yêu cầu mạng mà tải dữ liệu trực tiếp, giúp tăng tốc hiển thị đồ hoạ tích hợp.
Picasso sử dụng kiến trúc dựa trên RequestCreator và Dispatcher. Mỗi yêu cầu được tạo qua Picasso.get().load() và thực thi trong pool luồng. Dispatcher quản lý hàng đợi yêu cầu, ưu tiên và hủy bỏ khi ImageView được sử dụng lại.
Khi gọi into(view), Picasso tạo một đối tượng Action chứa URL, các biến đổi, mục tiêu và callback. Action được đặt vào hàng đợi của Dispatcher. Engine tải hình ảnh qua Downloader (mặc định là OkHttp), giải mã Bitmap, áp dụng các biến đổi và chuyển kết quả đến luồng UI. Tất cả hình ảnh đều tự động vừa với kích thước ImageView.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
Cài đặt Picasso được thực hiện qua Gradle. Thư viện được phân phối qua Maven Central và không yêu cầu cấu hình phức tạp. Phiên bản Android API tối thiểu là 21.
Trong tệp build.gradle cấp module, thêm implementation ‘com.squareup.picasso:picasso:2.8’. Sau khi đồng bộ Gradle, Picasso sẵn sàng sử dụng. Đối với các thao tác mạng, Picasso tự động sử dụng OkHttp nếu có trong dự án hoặc HttpURLConnection tích hợp sẵn.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka để tải từ OkHttp (tuỳ chọn)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
Chỉ báo gỡ lỗi của Picasso hiển thị một hình tam giác màu ở góc mỗi hình ảnh: đỏ cho tải mạng, xanh lam cho bộ nhớ đệm đĩa, xanh lục cho bộ nhớ đệm RAM. Nó được kích hoạt bằng cách gọi setIndicatorsEnabled(true) trên phiên bản Picasso. Kích thước bộ nhớ đệm mặc định là 15% bộ nhớ khả dụng của thiết bị.
Để cấu hình phiên bản tùy chỉnh của Picasso, hãy sử dụng Picasso.Builder. Nó cho phép đặt Executor cho các luồng nền, Downloader cho các yêu cầu mạng, MemoryCache và DiskCache. Phiên bản tùy chỉnh đặc biệt hữu ích trong các bài kiểm thử, nơi có thể thay thế Downloader bằng một stub trả về hình ảnh mà không cần yêu cầu mạng.
Các ví dụ dưới đây minh họa các kịch bản điển hình khi làm việc với Picasso: tải hình ảnh đơn giản, sử dụng biến đổi và tải trong RecyclerView.
Tải cơ bản vào ImageView được thực hiện bằng một lời gọi duy nhất. Picasso tự động điều chỉnh hình ảnh theo kích thước view, xét đến scaleType. Placeholder được hiển thị cho đến khi tải hoàn tất và hình ảnh lỗi được hiển thị khi có lỗi kết nối.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
BlurTransformation làm mờ hình ảnh với bán kính nhất định. Các biến đổi tùy chỉnh triển khai giao diện Transformation với phương thức transform. Bộ nhớ đệm lưu trữ kết quả biến đổi dưới một khóa duy nhất để tránh áp dụng lại.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// áp dụng làm mờ
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
Trong RecyclerView, Picasso tự động hủy các yêu cầu cho ImageView đã cuộn ra khỏi màn hình và tái sử dụng hình ảnh đã tải. Điều này ngăn chặn rò rỉ bộ nhớ và đảm bảo cuộn mượt mà.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
So sánh Picasso và Glide là một câu hỏi thường gặp khi chọn thư viện tải hình ảnh cho Android. Cả hai thư viện đều giải quyết cùng một nhiệm vụ nhưng có các ưu tiên và đặc điểm sử dụng khác nhau.
Picasso phù hợp hơn cho các dự án mà đơn giản và kích thước APK tối thiểu là quan trọng. Glide được chọn khi cần hỗ trợ GIF, khung hình video và tối ưu hóa bộ nhớ tối đa. Glide tự động chia tỉ lệ hình ảnh theo kích thước chính xác của ImageView, giảm mức tiêu thụ bộ nhớ tới 50% so với Picasso trong một số kịch bản.
Trong các bài kiểm thử hiệu năng, Glide cho thấy kết quả tốt hơn khi làm việc với RecyclerView nhờ cơ chế tải trước và tự động hủy yêu cầu trong quá trình cuộn nhanh. Picasso sử dụng chiến lược đơn giản hơn, khiến nó có thể dự đoán nhưng kém hiệu quả hơn trên khối lượng dữ liệu lớn.
Picasso tập trung vào đơn giản hóa API và kích thước tối thiểu. Glide cung cấp chức năng rộng hơn: hỗ trợ GIF, hình ảnh động, khung hình video và tích hợp vòng đời. Glide cũng quản lý bộ nhớ hiệu quả hơn nhờ tự động chia tỉ lệ theo kích thước ImageView.
| Tiêu chí | Picasso | Glide |
|---|---|---|
| Kích thước thư viện | ~120 KB | ~500 KB |
| Hỗ trợ GIF | Không | Có |
| Khung hình video | Không | Có |
| Nhà phát triển | Square | Google (Bumptech) |
| API | Chuỗi fluent | RequestBuilder |
Theo Android Developer Relations, Google khuyên dùng Glide là thư viện ưu tiên để tải hình ảnh trong các dự án mới. Picasso vẫn là một lựa chọn tuyệt vời cho các dự án đơn giản không cần GIF và khung hình video.
Câu hỏi thường gặp
Picasso nhỏ hơn và dễ sử dụng hơn. Glide hỗ trợ GIF và khung hình video, quản lý bộ nhớ hiệu quả hơn và được Google khuyên dùng. Lựa chọn phụ thuộc vào nhu cầu của dự án về các định dạng bổ sung.
Để xóa bộ nhớ đệm Picasso, hãy sử dụng phương thức Picasso.get().invalidate(url) cho một hình ảnh hoặc shutdown() để xóa hoàn toàn. Bộ nhớ đệm đĩa bị xóa khi cài đặt lại ứng dụng hoặc qua cài đặt hệ thống.
Picasso không phụ thuộc vào xoay màn hình. Các hình ảnh đã tải được lưu trong bộ nhớ đệm và hiển thị từ đó khi Activity được tạo lại. Để tăng tốc, hãy sử dụng ViewModel cùng với Picasso để giữ lại dữ liệu đã tải.
Có, Picasso hoàn toàn tương thích với Kotlin. Các nhà phát triển Kotlin có thể sử dụng hàm mở rộng để có cú pháp ngắn gọn hơn hoặc áp dụng thư viện koptional để xử lý các giá trị null khi tải hình ảnh.
Picasso sử dụng LruCache cho bộ nhớ đệm trong RAM, tự động dọn dẹp các hình ảnh không sử dụng. Kích thước bộ nhớ đệm mặc định là 15% bộ nhớ khả dụng của ứng dụng. Khi bộ nhớ thấp, Picasso giải phóng tài nguyên qua onTrimMemory.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm