Tôi đang triển khai hệ thống bộ nhớ cache hình ảnh để lưu vào bộ nhớ cache hình ảnh đã tải xuống.Android: Chiến lược bộ nhớ cache hình ảnh và bộ nhớ cache kích thước
Chiến lược của tôi dựa trên bộ nhớ cache hai cấp: Cấp bộ nhớ và mức đĩa.
Lớp học của tôi rất giống với lớp được sử dụng trong droidfu project
ảnh tải về của tôi được đưa vào một hashmap và Objet Bitmap được bọc bên trong một đối tượng SoftRererence. Ngoài ra mỗi hình ảnh được lưu vĩnh viễn vào đĩa. Nếu không tìm thấy hình ảnh được yêu cầu vào Hashmap<String,SoftReference<Bitmap>>
, nó sẽ được tìm kiếm trên đĩa, được đọc và sau đó được đẩy trở lại vào băm. Nếu không, hình ảnh sẽ là được tải xuống từ mạng. Vì tôi lưu trữ các hình ảnh vào momery thiết bị phisical, tôi đã thêm một tấm séc trị bảo tồn không gian thiết bị và ở lại dưới một 1M không gian chiếm đóng:
private void checkCacheUsage() {
long size = 0;
final File[] fileList = new File(mCacheDirPath).listFiles();
Arrays.sort(fileList, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f2.lastModified()).compareTo(
f1.lastModified());
}
});
for (File file : fileList) {
size += file.length();
if (size > MAX_DISK_CACHE_SIZE) {
file.delete();
Log.d(ImageCache.class.getSimpleName(),
"checkCacheUsage: Size exceeded " + size + "("
+ MAX_DISK_CACHE_SIZE + ") wiping older file {"+file.toString()+"}");
}
}
}
Phương pháp này được gọi là đôi khi afte một văn bản đĩa:
Random r = new Random();
int ra = r.nextInt(10);
if (ra % 2 == 0){
checkCacheUsage();
}
Điều tôi muốn thêm là kiểm tra cùng kích thước HashMap để ngăn chặn nó phát triển quá nhiều. Một cái gì đó như thế này:
private synchronized void checkMemoryCacheUsage(){
long size = 0;
for (SoftReference<Bitmap> a : cache.values()) {
final Bitmap b = a.get();
if (b != null && ! b.isRecycled()){
size += b.getRowBytes() * b.getHeight();
}
if (size > MAX_MEMORY_SIZE){
//Remove some elements from the cache
}
}
Log.d(ImageCache.class.getSimpleName(),
"checkMemoryCacheUsage: " + size + " in memory");
}
Câu hỏi của tôi là: gì có thể là một giá trị MAX_MEMORY_SIZE phải không? Ngoài ra, đó có phải là cách tiếp cận tốt không? Câu trả lời hay cũng có thể là: "Đừng làm vậy! SoftReference đã đủ rồi"
Bạn cũng có thể xem xét API này http: //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html – carfield