Monthly Archives: August 2012

Sử dụng LruCache trong android

Hi all,
Rất cảm ơn các bạn đã subscribe, hôm nay mới có chút hứng viết bài cho blog, chủ đề mình đề cập đến hôm này là LruCache, Đây là đối tượng được Android cung cấp để thực cache dữ liệu, giúp ứng dụng của bạn chạy nhanh hơn . Hồi xưa khi mới bắt đầu với android thì mình gặp phải trường hợp này, mình lên mạng tìm được một đoạn code phân trang, và trong code đó nó có một hàm khi một trang được hiển thị lên thì nó lại gọi hàm thể hiện cho trang đó, và lặp lại đoạn mã trong hàm, và đơn giản là mình download một bức hình từ internet và chuyển nó tới ImageView, mỗi khi nó nó tới trang nào là nó lại download và hiển thị … Mặc dù ảnh đã download rồi thì nó vẫn cứ download, điều đó quá tệ cho một ứng dụng mà bạn cần hoàn thiện . Giải pháp đơn giản mà các bạn nghĩ tới ngay là có cách nào nó load trước ảnh cho vào một adapter rồi dùng adapter để binding tới View kia, nhưng như thế vân chưa phải tối ưu, vì nó vẫn cứ download và hiển thị mặc dù ảnh đó đã được download . Giải pháp tối ưu nhất là cache, nói đến cache thì tất nhiên các bạn có thể sử dụng thuật toán mà Romain guy đã public nhớ hok lầm thì năm 2010, ok hok bàn đến chuyện thời gian nữa … hôm nay chúng ta sẽ sử dụng LruCache để cache, mình hay dùng đối tượng này để cache khi mà tài nguyên ảnh nó đã ở trong android rồi, chứ hok phải lấy từ internet ( với mình thì mình hay làm thế, còn tùy bạn ), nếu các bạn muốn biết sự hiểu quả hãy sử hai Adapter của hình ảnh, một hok cache 1 cache sử dụng LruCache là biết ngay, hãy scroll xuống và cảm nhận .

   int cacheSize = 4 * 1024 * 1024; // 4MiB
   LruCache bitmapCache = new LruCache(cacheSize) {
       protected int sizeOf(String key, Bitmap value) {
           return value.getByteCount();
       
   }}

Đoạn mã này dùng để khởi tạo đối tượng cache của chúng ta, Đối với LruCache bạn cần khai báo dung lượng bộ nhớ cache là bao nhiêu . Cơ chế làm việc của LruCache theo cấu trúc Hàng đợi, khi bạn thêm một bitmap vào LruCache thì cũng thêm như hàng đợi làm việc, và cách nó lấy bitmap đó ra cũng như hàng đợi làm việc . LruCache lưu các đối tượng theo dạng Key – Value, nên thật dễ ràng để lấy ra đối tượng đã được cache . 🙂

Và một điều chú ý nữa nếu dung lượng cache đã đầy rồi thì sao điều gì xảy ra, lúc đó đối tượng ở cuối hàng đợi (ở đây mình dùng bitmap) sẽ được giải phóng, android có thể coi nó như vùng nhớ rác và có thể bị loại bỏ . Đối tượng này được hỗ trợ ở Android 3.1 (Honeycomb MR1), tuy nhiên bạn sẽ có cho nó support tất cả version android thì bản sử dụng đối tượng này trong Android’s Support Package , Hãy trải nghiệm nó và thưởng thức thành quá . Trên mọi tiêu chí chúng ta cần đưa ra kiến thức đúng và có thể sử dụng được bạn có thể góp ý cho bài viết này, nếu nó đúng chúng ta sẽ chỉnh sửa lại bài viết . Tình thần Chào thân ái và quyết thắng .