Glide là một thư viện tải hình ảnh trong Android, được Google hỗ trợ thông qua dự án Bumptech. Thư viện cung cấp khả năng tải hình ảnh, hoạt ảnh GIF và khung hình video hiệu quả với quản lý bộ nhớ tự động. Theo kho lưu trữ Glide trên GitHub, dự án được sử dụng bởi hơn 200.000 ứng dụng. Glide được Google khuyến nghị là thư viện ưa thích để tải đồ họa trong Android.
Những điểm chính
Glide là một thư viện để tải nhanh và hiệu quả hình ảnh, GIF hoạt hình và khung hình video trong các ứng dụng Android. Dự án được phát triển bởi Bumptech dưới sự bảo trợ của Google và được sử dụng rộng rãi trong các ứng dụng chính thức của Google.
Kiến trúc bên trong của Glide được xây dựng trên cách tiếp cận dựa trên thành phần: Engine quản lý việc thực thi yêu cầu, DecodeJob chịu trách nhiệm giải mã và ResourceDecoder chuyển đổi dữ liệu thô thành Bitmap hoặc Drawable. Mỗi giai đoạn có thể được tùy chỉnh thông qua các mô-đun và sổ đăng ký, làm cho Glide trở thành một thư viện cực kỳ linh hoạt cho các định dạng hình ảnh không chuẩn.
Không giống như nhiều đối thủ cạnh tranh, Glide được thiết kế ngay từ đầu với các đặc điểm của Android: vòng đời của Activity và Fragment, xoay màn hình, thay đổi cấu hình. Thư viện tự động tạm dừng và tiếp tục tải tùy thuộc vào trạng thái của thành phần.
Theo Android Developers, Glide là thư viện được khuyến nghị để tải hình ảnh trong tài liệu chính thức của Google. Nó được sử dụng trong Google Play, Google Maps và các sản phẩm khác của công ty, khẳng định độ tin cậy và hiệu suất của nó.
Sự khác biệt chính giữa Glide và các giải pháp thay thế là khả năng tự động điều chỉnh kích thước hình ảnh phù hợp với kích thước ImageView. Trong khi Picasso tải hình ảnh ở độ phân giải đầy đủ và sau đó điều chỉnh kích thước, Glide giải mã tệp trực tiếp ở kích thước cần thiết. Điều này giảm mức tiêu thụ bộ nhớ đỉnh điểm và tăng tốc hiển thị trong danh sách có kích thước ô khác nhau.
Glide cung cấp một loạt các chức năng để làm việc với hình ảnh, bao gồm cả các kịch bản tải nội dung đơn giản và phức tạp.
GIF và WebP hoạt hình được Glide tải và hiển thị dễ dàng như hình ảnh tĩnh. Thư viện tự động phát hiện định dạng theo loại MIME và giải mã hoạt ảnh, hiển thị các khung hình trong luồng nền. Các phương thức asGif và asBitmap có sẵn để kiểm soát phát lại.
Glide tự động liên kết với vòng đời của Activity, Fragment và View. Khi một Activity bị tạm dừng, việc tải bị đình chỉ; khi bị hủy, nó bị hủy bỏ. Điều này ngăn rò rỉ bộ nhớ và tải hình ảnh cho các màn hình đã đóng. Tích hợp hoạt động thông qua hỗ trợ LifecycleOwner.
Glide có thể trích xuất khung hình từ video qua URL hoặc đường dẫn cục bộ. Phương thức asBitmap() kết hợp với load() được sử dụng cho URI video. Glide tự động chọn khung hình chính hoặc khung hình tại một mốc thời gian được chỉ định. Điều này hữu ích để hiển thị hình thu nhỏ video.
GlideApp là một lớp được tạo ra cung cấp API mở rộng dựa trên cấu hình AppGlideModule. Nó cho phép sử dụng các phương thức không có sẵn trong Glide.with tiêu chuẩn: tải với các tùy chọn mặc định tùy chỉnh, tích hợp với thư viện và các biến đổi được cài đặt sẵn. Việc tạo yêu cầu chú thích @GlideModule trong một lớp mở rộng AppGlideModule.
Glide sử dụng kiến trúc đa lớp với công cụ, bộ giải mã, biến đổi và bộ nhớ đệm. Mỗi yêu cầu đi qua một chuỗi các trình xử lý để tối ưu hóa việc tải cho một ImageView cụ thể.
Khi into(view) được gọi, Glide kiểm tra bộ nhớ đệm: tài nguyên đang hoạt động, bộ nhớ đệm, bộ nhớ đệm đĩa và chỉ sau đó là mạng. Hình ảnh tự động được điều chỉnh kích thước phù hợp với kích thước ImageView mục tiêu, có tính đến mật độ màn hình và scaleType. Điều này giảm mức sử dụng bộ nhớ — một lợi thế chính của Glide.
Glide.with(context)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.override(400, 300)
.centerCrop()
.into(imageView)
Cài đặt Glide được thực hiện qua Gradle. Thư viện yêu cầu cấu hình thông qua AppGlideModule để tạo API. Phiên bản API Android tối thiểu là 21.
Trong build.gradle, thêm Glide với trình xử lý chú thích kapt để tạo API GlideApp. Đối với Kotlin, sử dụng kapt thay vì annotationProcessor. Glide phiên bản 4.16+ hoạt động ổn định với Android Gradle Plugin 8.x.
dependencies {
implementation "com.github.bumptech.glide:glide:4.16.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.16.0"
}
// Sử dụng kapt cho Kotlin
// kapt "com.github.bumptech.glide:compiler:4.16.0"
AppGlideModule là một thành phần bắt buộc để cấu hình Glide. Nó cho phép đặt kích thước bộ nhớ đệm, HttpStack tùy chỉnh và đăng ký bộ giải mã tùy chỉnh. Mô-đun được Glide quét khi khởi động ứng dụng. Chú thích @GlideModule đăng ký nó tự động.
@GlideModule
public class MyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSize = 250 * 1024 * 1024;
builder.setDiskCache(
new DiskLruCacheFactory(cacheDir.getPath(), diskCacheSize)
);
}
}
Các ví dụ dưới đây minh họa các kịch bản điển hình: tải hình ảnh, làm việc với GIF và trích xuất khung hình video.
Tải cơ bản qua Glide.with().load().into() — mã tối thiểu để hiển thị hình ảnh từ mạng. Glide tự động điều chỉnh kích thước ImageView. Placeholder được hiển thị trong khi tải và error khi thất bại.
Glide.with(fragment)
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
GIF được tải giống như hình ảnh tĩnh — Glide tự động phát hiện định dạng theo loại nội dung. Để buộc tải dưới dạng hình ảnh tĩnh, sử dụng asBitmap(); cho GIF, sử dụng asGif(). Glide giải mã hiệu quả chỉ các khung hình hiển thị.
Glide.with(context)
.asGif()
.load("https://example.com/animation.gif")
.into(imageView)
// Tải khung hình đầu tiên của GIF dưới dạng hình ảnh tĩnh
Glide.with(context)
.asBitmap()
.load("https://example.com/animation.gif")
.into(imageView)
Một khung hình video được Glide trích xuất từ URI video cục bộ hoặc từ xa. Theo mặc định, Glide tải khung hình chính. Để chỉ định một mốc thời gian cụ thể, sử dụng frameMillis. Điều này thuận tiện cho việc hiển thị hình xem trước trong thư viện video.
String videoUrl = "https://example.com/video.mp4";
Glide.with(context)
.asBitmap()
.load(videoUrl)
.override(200, 200)
.into(imageView)
Tối ưu hóa Glide cho RecyclerView là một kỹ năng quan trọng khi phát triển ứng dụng với số lượng lớn hình ảnh. Cấu hình phù hợp ngăn ngừa lag và lỗi OOM.
Một trong những tính năng chính của Glide là tích hợp RecyclerView thông qua RecyclerViewPreloader. Thành phần này phân tích tốc độ và hướng cuộn, tải trước các hình ảnh sẽ xuất hiện trên màn hình trong vài mục tiếp theo. Để sử dụng bộ tải trước, bạn cần triển khai giao diện PreloadSizeProvider và truyền nó vào hàm tạo cùng với ImageView mục tiêu.
Sử dụng phương thức override() với kích thước ImageView chính xác giúp tăng tốc đáng kể. Khi Glide biết kích thước chính xác của mục tiêu, nó có thể giải mã hình ảnh trực tiếp ở độ phân giải cần thiết, bỏ qua bước điều chỉnh kích thước. Điều này giảm thời gian giải mã và mức tiêu thụ bộ nhớ đỉnh điểm từ 30–40%.
Đối với nguồn cấp dữ liệu có nội dung không đồng nhất, hãy sử dụng RequestOptions khác nhau cho mỗi loại mục. Ví dụ, cho hình ảnh biểu ngữ lớn, bạn có thể đặt override(1200, 600) và chất lượng RGB_565, trong khi cho hình đại diện — override(200, 200) và làm tròn qua transform. Cách tiếp cận này sử dụng tài nguyên tối ưu cho mỗi loại nội dung.
Glide cung cấp các tùy chọn xử lý lỗi linh hoạt thông qua hình ảnh lỗi và RequestListener tùy chỉnh. RequestListener cho phép phản ứng với tải thành công hoặc thất bại — ghi nhật ký lỗi hoặc gửi phân tích. Bạn cũng có thể cấu hình dự phòng — một hình ảnh được hiển thị khi load() nhận được null thay vì URL.
Sử dụng RecyclerViewPreloader để tải trước hình ảnh trước khi người dùng cuộn đến chúng. Glide hỗ trợ tích hợp RecyclerView thông qua bộ tải trước phân tích tốc độ cuộn và tải hình ảnh trước.
Nhân thumbnail cho phép hiển thị phiên bản thu nhỏ của hình ảnh trước, sau đó tải phiên bản đầy đủ. Gọi thumbnail(0.25f) tải phiên bản 25% kích thước được hiển thị ngay lập tức, trong khi hình ảnh kích thước đầy đủ được tải sau. Điều này tạo cảm giác tải tức thì.
Đối với bộ điều hợp danh sách, hãy sử dụng .override() với kích thước ImageView chính xác để Glide không điều chỉnh kích thước hình ảnh mỗi lần. Điều này giảm tải CPU và mức tiêu thụ bộ nhớ. Kích thước bộ nhớ đệm được chọn theo thực nghiệm, nhưng 250 MB cho đĩa và 20% bộ nhớ khả dụng là điểm khởi đầu tốt.
Câu hỏi thường gặp
Glide hỗ trợ GIF, khung hình video và WebP hoạt hình. Nó quản lý bộ nhớ hiệu quả hơn và được Google khuyến nghị. Picasso nhỏ hơn và dễ sử dụng hơn. Đối với các dự án phức tạp, hãy chọn Glide.
Glide chấp nhận LifecycleOwner (Fragment, Activity) hoặc View. Thư viện tự động theo dõi trạng thái qua LifecycleObserver: tạm dừng tải khi tạm dừng và hủy bỏ khi hủy, ngăn rò rỉ.
Có, sử dụng asBitmap() trước load(). Glide sẽ tải GIF như một hình ảnh tĩnh và chỉ hiển thị khung hình đầu tiên. Điều này hữu ích cho danh sách nơi hoạt ảnh GIF không mong muốn vì lý do hiệu suất.
Bộ nhớ đệm của Glide bao gồm ba cấp: tài nguyên đang hoạt động (đang sử dụng), bộ nhớ (bộ nhớ đệm LRU) và đĩa (LruCache). Hình ảnh được tải từ bộ nhớ đệm được hiển thị ngay lập tức. Bộ nhớ đệm tự động được xóa khi bộ nhớ thấp.
Máy khách HTTP tùy chỉnh được đăng ký qua OkHttpUrlLoader trong AppGlideModule. Ghi đè registerComponents và đăng ký OkHttpClient của bạn. Điều này cho phép thêm bộ chặn, chứng chỉ và thời gian chờ tùy chỉnh.
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