Picasso: tải hình ảnh và làm việc trong ứng dụng Android

Tác giả: IT Sectr Đã đăng: 2026-05-05 Thời gian đọc: 8 phút

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 — thư viện tải hình ảnh từ Square với API đơn giản cho Android
  • Bộ nhớ đệm trên đĩa và trong RAM giảm thời gian tải hình ảnh lặp lại
  • Biến đổi Crop, Resize và Rotate được áp dụng cho hình ảnh ngay lập tức
  • Placeholder và hình ảnh lỗi được hiển thị trong khi tải và khi có lỗi
  • Ưu tiên tải cho phép quản lý thứ tự hiển thị hình ảnh

Picasso là gì?

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 và hủy yêu cầu

Ư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.

Tính năng chính của Picasso

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 đa cấp

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 hình ảnh

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 và hình ảnh lỗi

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.

Tải từ nhiều nguồn khác nhau

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 hoạt động như thế nào?

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.

Kiến trúc yêu cầu

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.

java
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 và cấu hình Picasso

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.

Thêm phụ thuộc

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.

groovy
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 và bộ nhớ đệm

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.

Ví dụ sử dụng Picasso

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 hình ảnh vào ImageView

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.

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

Áp dụng biến đổi tùy chỉnh

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.

java
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";
    }
}

Tải hình ảnh trong RecyclerView

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à.

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

Picasso so với Glide: so sánh thư viện

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íPicassoGlide
Kích thước thư viện~120 KB~500 KB
Hỗ trợ GIFKhông
Khung hình videoKhông
Nhà phát triểnSquareGoogle (Bumptech)
APIChuỗi fluentRequestBuilder

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 khác Glide ở điểm nào?

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.

Làm thế nào để xóa bộ nhớ đệm Picasso?

Để 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 xử lý xoay màn hình như thế nào?

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ó thể sử dụng Picasso trong Kotlin không?

, 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 quản lý bộ nhớ như thế nào?

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

  • Picasso — thư viện tải hình ảnh nhẹ từ Square với API tối thiểu
  • Bộ nhớ đệm trên đĩa và trong RAM với quản lý kích thước tự động
  • Biến đổi CenterCrop, CenterInside và tùy chỉnh qua giao diện Transformation
  • Placeholder và hình ảnh lỗi cho trải nghiệm người dùng mượt mà
  • Tự động hủy yêu cầu trong RecyclerView ngăn tải không cần thiết
  • Chỉ báo gỡ lỗi giúp nhận dạng trực quan nguồn hình ảnh
  • Kích thước thư viện chỉ 120 KB — tác động tối thiểu đến kích thước APK

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.

Thảo luận dự án

Đọc thêm