Кэширование диска в Volley не работает
Я использую залп для кэширования изображений в приложении. Кэширование памяти работает нормально, но изображение не кэшируется на диске. Код приведен ниже
VolleySingleton.java
public class VolleySingleton {
public static final String TAG = "VolleySingleton";
private static VolleySingleton mInstance = null;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private VolleySingleton(Context context){
mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(this.mRequestQueue,new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(3);
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}
});
}
public static VolleySingleton getmInstance(Context context){
if(mInstance == null){
mInstance = new VolleySingleton(context);
}
return mInstance;
}
public RequestQueue getmRequestQueue(){
return this.mRequestQueue;
}
public ImageLoader getmImageLoader(){
return mImageLoader;
}
}
Изображения загружаются в CustomAdapter ChannelAdapter.java
private class ChannelAdapter extends BaseAdapter{
private LayoutInflater inflater;
private VolleySingleton volleySingleton;
public ChannelAdapter(Context context) {
super(context);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
volleySingleton = VolleySingleton.getmInstance(context);
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view == null){
view = inflater.inflate(R.layout.item,viewGroup,false);
}
NetworkImageView imageView = (NetworkImageView) view.findViewById(R.id.imageView);
TextView textView = (TextView) view.findViewById(R.id.textView);
textView.setText(tvChannel.getName());
imageView.setImageUrl(tvChannel.getImages().get(link,volleySingleton.getmImageLoader());
return view;
}
}
2 ответа
ОК, я исправил проблему. Это было из-за того, что у изображений, которые я получил с сервера, в ответе был установлен тег управления кэшированием без кэширования
Cache-Control: no-cache,no-cache,max-age=15552000
Я заставил залп пренебречь этим тегом, изменив HttpHeaderParser.java
в библиотеке. Теперь работает нормально
@ SathMk
Я предлагаю вам не игнорировать любой тег Cache-Control Header, если вы действительно хотите кэшировать изображение дольше, когда заголовок говорит no-cahce, то вы можете обмануть, чтобы увеличить максимальный возраст, если он не равен нулю, как в вашем кэше. В противном случае кеш будет работать неправильно для запроса данных.
if (headerValue != null) {
hasCacheControl = true;
String[] tokens = headerValue.split(",");
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i].trim();
if (token.equals("no-cache") || token.equals("no-store")) {
//Check if no-cache is there then still check again the max-age
if (token.startsWith("max-age=")) {
try {
maxAge = Long.parseLong(token.substring(8));
} catch (Exception e) {
return null;
}
}
} else if (token.startsWith("max-age=")) {
try {
maxAge = Long.parseLong(token.substring(8));
} catch (Exception e) {
}
} else if (token.equals("must-revalidate") || token.equals("proxy-revalidate")) {
maxAge = 0;
}
}
}
Проверьте, нет ли кеша, затем еще раз проверьте максимальный возраст