2014-07-25 27 views
8

Tôi muốn biết chính xác Thư viện Picasso đang lưu trong bộ nhớ đệm hình ảnh bên trong ứng dụng như thế nào. Tôi biết nó đã sử dụng HttpHeaders để kiểm tra thời tiết để tìm nạp hình ảnh từ mạng.Cách Picasso thực sự Cache Hình ảnh

Nhưng, có khung thời gian nào đang lưu trong bộ nhớ cache hình ảnh không?
Giống như thương lượng bộ nhớ cache sau một ngày hay gì đó?

Vấn đề là dự án của tôi đang tải số lượng lớn các hình ảnh nhỏ từ mạng. Đôi khi, những hình ảnh mới được phản ánh trong lần ra mắt tiếp theo. Nhưng, một số lần, nó không.

Phần tồi tệ nhất là một số hình ảnh phản ánh những thay đổi trong khi những hình ảnh khác không phải là thay đổi được thực hiện cùng một lúc.
Nhưng, khi tôi gỡ bỏ cài đặt các ứng dụng, tất cả các hình ảnh có phản ánh những thay đổi (tất nhiên.)

Cần phải có một cái gì đó về bộ nhớ đệm trong Picasso.

Và vui lòng không cho tôi biết sử dụng OkHttp để kiểm soát bộ nhớ cache trong Picasso.
Dự án của tôi đang sử dụng AsyncHttpClient từ Apache và nó quá lớn để cập nhật.
(không phải bởi tôi, tất nhiên. Tôi sẽ chỉ tạo một trình trợ giúp mạng nhỏ với UrlConnection thay vì triển khai toàn bộ AsyncHttpClient.)

Dù sao, bất kỳ ý tưởng hoặc con trỏ nào cũng sẽ được đánh giá cao.
Dòng dưới cùng: Không OkHttp. Chỉ muốn biết về cơ chế kiểm soát bộ nhớ cache trên Picasso.

Trân

Trả lời

4

Theo như tôi biết Picasso không xóa bộ nhớ cache của chính nó, do đó trong ứng dụng của chúng tôi, chúng tôi có đang hiển thị rằng "thủ công". Mã để làm điều này là:

private static final String PICASSO_CACHE = "picasso-cache"; 

public static void clearCache(Context context) { 
    final File cache = new File(
      context.getApplicationContext().getCacheDir(), 
      PICASSO_CACHE); 
    if (cache.exists()) { 
     deleteFolder(cache); 
    } 
} 

private static void deleteFolder(File fileOrDirectory) { 
    if (fileOrDirectory.isDirectory()) { 
     for (File child : fileOrDirectory.listFiles()) 
      deleteFolder(child); 
    } 
    fileOrDirectory.delete(); 
} 

Bạn có thể kích hoạt công nhân dọn dẹp này mỗi ngày/tuần, tùy thuộc vào những gì bạn cần trong ứng dụng của mình.

+3

Điều này chỉ hoạt động nếu bạn đang sử dụng OkHttp hoặc HttpUrlConnection mà bài đăng tuyên bố rõ ràng là không. –

+0

Đủ công bằng, chúng tôi đang sử dụng OkHttp. – Ciprian

+0

Nó cũng hoạt động cho AsynHttpClient của tôi.:-) –

14

Picasso chỉ có bộ nhớ cache.

Nếu hình ảnh nằm trong bộ nhớ cache, nó sử dụng nó. Nếu không, khi hình ảnh được tải từ nguồn từ xa của nó (mạng, nhà cung cấp nội dung, hệ thống tập tin, vv), nó được đặt trong bộ nhớ cache để tra cứu trong tương lai.

Bộ nhớ cache là một LRU do đó càng nhiều hình ảnh được sử dụng thì càng có nhiều khả năng nó sẽ vẫn còn trong bộ nhớ cache. Hình ảnh không được yêu cầu thường xuyên sẽ bị đuổi theo thời gian. Không có trục xuất về thời gian và bộ nhớ cache không tôn trọng ngữ nghĩa bộ nhớ đệm của bất kỳ tiêu đề HTTP nào (nếu hình ảnh từ mạng).

Picasso không có bộ nhớ cache trên đĩa. Nó dựa trên máy khách HTTP (tùy theo cái nào đang được sử dụng) cho 100% chức năng này. Một bộ nhớ cache sẽ được cài đặt cho cả OkHttp hoặc HttpUrlConnection (nếu một trong hai được sử dụng) tự động hoặc nếu một đã được sẽ được sử dụng.

Nếu bạn đang sử dụng ứng dụng khách HTTP tùy chỉnh, gánh nặng cho phép bộ nhớ cache được bật cho bạn người gọi.

+0

Cảm ơn Jake. Nó khá giải thích chính nó. Nhưng, bạn có thể giải thích thêm một chút về "bộ nhớ cache không tôn trọng ngữ nghĩa bộ nhớ đệm của bất kỳ tiêu đề HTTP nào" không? Và cũng về "Một bộ đệm sẽ được cài đặt cho cả OkHttp & HttpUrlConneciton"? Thành thật mà nói, tôi không muốn chạm vào cơ chế AsyncHttpClient đó. Và tôi thấy có giao diện "Cache" trong Picasso Source và LruCache đang thực hiện điều đó. Nó sẽ được khôn ngoan để thực hiện cơ chế bộ nhớ cache của riêng tôi bằng cách giả mạo Picasso? Nếu tôi thực hiện bộ nhớ cache của riêng mình, tôi có thể đặt trình kích hoạt để xóa nó theo khung thời gian giống như cách Ciprian được đề cập ở bên dưới không? –

+0

@JakeWharton, bạn đá, bạn có thể quan tâm đến câu hỏi "bổ sung" của tôi trong niềng răng ở phần cuối của .. http://stackoverflow.com/questions/25746356 Đó là một bí ẩn thực sự đối với tôi. Chúc mừng !!!! cảm ơn mọi người từ những người hâm mộ la hét của bạn – Fattie

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