如何删除Volley中的特定json feed缓存? clear()有效,但删除(url)不起作用

时间:2016-04-09 07:34:59

标签: java android caching android-volley

我有一个适用于Volley的适配器来处理HTTP请求,使用OKhttp3作为传输,DiskBasedCache作为缓存实现。

我正在尝试使用.remove(url)从缓存中删除特定的JSON Feed请求,但它无法正常工作。这是一个示例代码:

在活动中提出请求:

String url = "http://somewebsite.com/feed.json"

VolleyStringRequest stringRequest = new VolleyStringRequest(Method.GET,null, url,responseListener(),errorListener());

RequestQueue queue = CustomVolleyRequestQueue.getInstance(context).getRequestQueue();

queue.add(stringRequest);

完成某项操作后删除缓存:

Cache cache = CustomVolleyRequestQueue.getInstance(context).getRequestQueue().getCache();

Cache.Entry cacheEntry = cache.get(url);

if (cacheEntry != null) {
     Log.d("cache", "has_cache");
} else {
     Log.d("cache", "no cache");
}

cache.remove(url);

但是,在logCat中,键url返回“no cache”,cache.remove(url)生成

 DiskBasedCache.remove: Could not delete cache entry for key=http://somewebsite.com/feed.json, 
 filename=-159673043453434434

有谁知道如何使用cache.remove(url)? Volley是否使用url作为缓存条目的密钥?我不想使用cache.clear(),只是删除特定的请求缓存。

CustomVolleyRequestQueue:

public class CustomVolleyRequestQueue {

    private static CustomVolleyRequestQueue mInstance;
    private static Context mCtx;
    private RequestQueue mRequestQueue;

    private CustomVolleyRequestQueue(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();
    }

    public static synchronized CustomVolleyRequestQueue getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new CustomVolleyRequestQueue(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            Cache cache = new DiskBasedCache(mCtx.getCacheDir(), 10 * 1024 * 1024);
            Network network = new BasicNetwork(new OkHttpStack());
            mRequestQueue = new RequestQueue(cache, network);
            // Don't forget to start the volley request queue
            mRequestQueue.start();
        }
        return mRequestQueue;
    }
}

更新:我创建了一个扩展DiskBasedCache的自定义类,以检查它用于缓存的密钥。

public class CustomDiskBasedCache extends DiskBasedCache {

    public CustomDiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) {
        super(rootDirectory, maxCacheSizeInBytes);
    }

    @Override
    public synchronized void put(String key, Entry entry) {
        super.put( key,  entry);
        Log.d("cache_key",key);
    }
}

看起来每个缓存键都以0:为前缀,例如:

0:http://somewebsite.com/feed.json

我不知道为什么要添加它。

0 个答案:

没有答案