Кэширование диска в 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;
            }
        }
    }

Проверьте, нет ли кеша, затем еще раз проверьте максимальный возраст

Другие вопросы по тегам