2013-06-05 27 views
8

Tôi đang sử dụng Trình tải ảnh phổ dụng để hiển thị hình ảnh trong ứng dụng của tôi trong danh sách xem. Tôi đang sử dụng UnlimitedDiscCache vì đây là cơ chế bộ nhớ cache nhanh nhất theo tài liệu.Trình tải ảnh chung - bộ nhớ cache rõ ràng theo cách thủ công

Tuy nhiên, tôi muốn xóa bộ nhớ cache của đĩa khi ứng dụng của tôi bị đóng (ví dụ: onStop()) nhưng chỉ xóa các tệp được lưu trữ lâu nhất vượt quá giới hạn nhất định (như TotalSizeLimitedDiscCache).

tôi biết ImageLoader.clearDiscCache() nhưng trong trường hợp của tôi điều này sẽ xóa bộ nhớ cache hoàn toàn kể từ khi tôi đang sử dụng UnlimitedDiscCache trước ...

Vì vậy, tôi muốn có cơ chế bộ nhớ cache nhanh nhất khi người dùng tải và di chuyển các listviews và làm bộ nhớ cache chậm rõ ràng khi người dùng không còn tương tác với ứng dụng nữa.

Bất kỳ ý tưởng nào về cách tôi có thể đạt được điều này?

+0

Bạn không thể đảm bảo rằng ứng dụng đang dừng khi 'onStop()' được gọi. Điều đó chỉ nói rằng hoạt động hiện tại đang bị dừng lại. Việc mất hiệu suất là rất tối thiểu khi so sánh với thời gian thực hiện một cơ chế bộ nhớ đệm (có thể làm chậm các ứng dụng anyways). –

+0

@jeff_bordon Bạn có bất kỳ mã nào được sử dụng để tạo phiên bản ImageLoader không? @Androidy Có, bạn có thể phân biệt khi ứng dụng sắp kết thúc, như 'if (isFinishing()) {làm điều gì đó}' –

+0

@jeff_bordon bạn có thể có BoB (tốt nhất là cả hai). Xem nguồn tại đây https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/library/src/com/nostra13/universalimageloader/cache/disc/impl/LimitedAgeDiscCache.java Viết UnlimitedAgeDiskCache sẽ khá thẳng về phía trước. Tất cả những gì bạn cần biết là ngày tháng và sự khác biệt giữa bây giờ và sau đó. Tôi nghĩ rằng nó sẽ không làm giảm tốc độ của ListView nếu nó là vấn đề của vài ifs. –

Trả lời

1

việc kiểm tra này từ đây https://stackoverflow.com/a/7763725/1023248 có thể giúp bạn ..

@Override 
protected void onDestroy() { 
// closing Entire Application 
android.os.Process.killProcess(android.os.Process.myPid()); 
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit(); 
editor.clear(); 
editor.commit(); 
trimCache(this); 
super.onDestroy(); 
} 


public static void trimCache(Context context) { 
try { 
    File dir = context.getCacheDir(); 
    if (dir != null && dir.isDirectory()) { 
     deleteDir(dir); 

    } 
} catch (Exception e) { 
    // TODO: handle exception 
} 
} 


public static boolean deleteDir(File dir) { 
if (dir != null && dir.isDirectory()) { 
    String[] children = dir.list(); 
    for (int i = 0; i < children.length; i++) { 
     boolean success = deleteDir(new File(dir, children[i])); 
     if (!success) { 
      return false; 
     } 
    } 
} 

// <uses-permission 
// android:name="android.permission.CLEAR_APP_CACHE"></uses-permission> 
// The directory is now empty so delete it 

return dir.delete(); 
} 
0

Nếu bạn muốn xóa bộ nhớ cache từ bộ nhớ, bạn có thể sử dụng đoạn mã sau:

MemoryCacheUtils.removeFromCache(imageUri, ImageLoader.getInstance().getMemoryCache()); 

Nếu bạn cũng muốn để xóa bộ nhớ cache trong đĩa, bạn có thể sử dụng mã sau:

DiscCacheUtils.removeFromCache(imageUri, ImageLoader.getInstance().getDiscCache()); 

Đây là cách đơn giản hơn nhiều o f xoá bộ nhớ cache. Bạn có thể tìm câu trả lời tương tự trong luồng này:

How to force a cache clearing using Universal Image Loader Android?

Tôi hy vọng thông tin này là hữu ích. :)

Các vấn đề liên quan