我有一个适用于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
我不知道为什么要添加它。