+1 cho oleksandr_yefremov và skyfishjy cũng có, và cung cấp ở đây một bê tông, lớp tái sử dụng thích hợp cho json hoặc các API dựa trên chuỗi khác:
public class CachingStringRequest extends StringRequest {
public CachingStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
}
public CachingStringRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(url, listener, errorListener);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, parseIgnoreCacheHeaders(response));
}
}
nơi chức năng parseIgnoreCacheHeaders() com es từ câu trả lời oleksandr_yefremov ở trên.Sử dụng lớp CachingStringRequest ở bất cứ đâu mà kết quả là json được lưu vào cache trong 3 phút (trực tiếp) và 24 giờ (hết hạn nhưng vẫn có sẵn). Yêu cầu mẫu:
CachingStringRequest stringRequest = new CachingStringRequest(MY_API_URL, callback);
và trong hàm onResponse() của đối tượng gọi lại, phân tích cú pháp. Đặt bất kỳ giới hạn bộ nhớ cache nào bạn muốn - bạn có thể tham số hóa để thêm hết hạn tùy chỉnh theo yêu cầu.
Để giải trí, hãy thử điều này trong một ứng dụng đơn giản tải xuống json và hiển thị thông tin đã tải xuống. Đã lấp đầy bộ nhớ cache với bản tải xuống thành công đầu tiên, hãy xem kết xuất nhanh khi bạn thay đổi hướng trong khi bộ nhớ cache đang hoạt động (không có tải xuống nào xảy ra do lần truy cập bộ nhớ cache trực tiếp). Bây giờ hãy hủy ứng dụng, đợi 3 phút để bộ nhớ cache đó hết hạn (nhưng không phải 24 giờ để bộ nhớ cache bị xóa khỏi bộ nhớ cache), bật chế độ trên máy bay và khởi động lại ứng dụng. Cuộc gọi lại lỗi Volley sẽ xảy ra và cuộc gọi lại "thành công" onResponse() sẽ xuất hiện từ dữ liệu được lưu trong bộ nhớ cache, cho phép ứng dụng của bạn hiển thị cả nội dung và cũng biết/cảnh báo rằng nó đến từ bộ nhớ cache đã hết hạn.
Một cách sử dụng loại bộ nhớ đệm này là để giảm bớt Trình tải và các phương tiện khác để xử lý thay đổi định hướng. Nếu một yêu cầu đi qua một singleton Volley, và kết quả được lưu trữ, làm mới điều đó xảy ra thông qua thay đổi định hướng được kết xuất nhanh chóng từ bộ nhớ cache, tự động bởi Volley, mà không có Trình tải.
Tất nhiên, điều này không phù hợp với tất cả các yêu cầu. YMMV
điều này có nghĩa là bộ nhớ cache sẽ kéo dài hơn, onDestroy? Vì vậy, lần sau khi ứng dụng được tạo, ứng dụng sẽ tìm nạp từ bộ nhớ cache? – gaara87
Có, bộ nhớ đệm được lưu không chỉ trong bộ nhớ mà còn trên đĩa (xem lớp DiskBasedCache để biết chi tiết). Để kiểm tra nhanh, hãy tải một số dữ liệu, thoát khỏi ứng dụng của bạn, tắt wifi hoặc 3g và nhập lại ứng dụng của bạn. Bạn cũng có thể chỉ định kích thước bộ nhớ cache trong trường mMaxCacheSizeInBytes. –
Có, nó lưu trữ trong khi tôi đang ở trong ứng dụng, nhưng khi tôi thoát khỏi ứng dụng và quay trở lại ứng dụng, tìm nạp từ bộ nhớ cache trả về null. Do đó câu hỏi liệu nó có tồn tại ở giữa các vòng đời hoạt động hay không. – gaara87