告诉 Volley 不要使用缓存数据而是发起新的请求?
Tell Volley not to use cached data but to initiate a new request?
我在应用程序中遇到问题,我认为它可能与从缓存中提取数据的 Volley 有关。
也就是说,该应用程序与 API 紧密绑定,因此每个更改都会发送到 API,然后使用 Volley 库从 API 检索。因此,用户将打开一个弹出窗口,选择一些组来查看其项目,然后 select 一些值将其标记为收藏。弹出窗口将关闭,片段将重新加载新数据。
当用户再次打开弹出窗口时,select同组加载其数据,之前的项目将不会显示为收藏。但是当用户再次触摸同一个组以重新加载其数据时,该项目将显示为收藏。
代码我一步步调试,没有发现错误。所以我得出结论,Volley 可能正在从其缓存中提取数据,同时在我第二次单击该组时发起新的 API 请求。
我想测试一下是否是缓存问题,或者我必须进行更深入的调试。
有没有办法告诉 Volley 不要使用缓存的请求数据,而是向 API 发起新请求?类似于 don't use cached data, but make a new request
。
注意:我不想删除整个缓存。我只想告诉 Volley 什么时候向 API 发起一个全新的请求。
我以前也遇到过同样的问题,但你可以用这个来改变它
request.setShouldCache(false);
myQueue.add(request);
IMO,如果您的项目使用 Google 的 volley 作为模块(不是 jar 文件),您可以自定义其 classes,如下所示:
选项#1:
第一个文件,RequestQueue.java:
添加一个class变量private boolean mCacheUsed = true;
和以下构造函数:
public RequestQueue(Cache cache, Network network, int threadPoolSize,
ResponseDelivery delivery, boolean cacheUsed) {
mCache = cache;
mNetwork = network;
mDispatchers = new NetworkDispatcher[threadPoolSize];
mDelivery = delivery;
mCacheUsed = cacheUsed;
}
public RequestQueue(Cache cache, Network network, int threadPoolSize, boolean cacheUsed) {
this(cache, network, threadPoolSize,
new ExecutorDelivery(new Handler(Looper.getMainLooper())), cacheUsed);
}
public RequestQueue(Cache cache, Network network, boolean cacheUsed) {
this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE, cacheUsed);
}
然后,在 public <T> Request<T> add(Request<T> request) {
中,您检查如下:
// If the request is uncacheable, skip the cache queue and go straight to the network.
if (!request.shouldCache() || !mCacheUsed) {
mNetworkQueue.add(request);
return request;
}
第二个文件,Volley.java:
public static RequestQueue newRequestQueue(Context context, HttpStack stack, boolean cacheUsed) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network, cacheUsed);
queue.start();
return queue;
}
public static RequestQueue newRequestQueue(Context context, boolean cacheUsed) {
return newRequestQueue(context, null, cacheUsed);
}
最后在MainActivity中,例如:
如果要使用可用缓存:
RequestQueue requestQueue = Volley.newRequestQueue(this, true);
如果不想使用可用缓存:
RequestQueue requestQueue = Volley.newRequestQueue(this, false);
选项#2:
Request.java:
添加一个class变量public boolean mSkipAvailableCache = false;
RequestQueue.java:
在public <T> Request<T> add(Request<T> request)
里面,你检查如下:
// If the request is uncacheable, skip the cache queue and go straight to the network.
if (!request.shouldCache() || request.mSkipAvailableCache) {
mNetworkQueue.add(request);
return request;
}
MainActivity.java:
您可以设置
jsonArrayRequest.mSkipAvailableCache = true;
可用的缓存将不会被使用。
希望这对您有所帮助!
我在应用程序中遇到问题,我认为它可能与从缓存中提取数据的 Volley 有关。
也就是说,该应用程序与 API 紧密绑定,因此每个更改都会发送到 API,然后使用 Volley 库从 API 检索。因此,用户将打开一个弹出窗口,选择一些组来查看其项目,然后 select 一些值将其标记为收藏。弹出窗口将关闭,片段将重新加载新数据。
当用户再次打开弹出窗口时,select同组加载其数据,之前的项目将不会显示为收藏。但是当用户再次触摸同一个组以重新加载其数据时,该项目将显示为收藏。
代码我一步步调试,没有发现错误。所以我得出结论,Volley 可能正在从其缓存中提取数据,同时在我第二次单击该组时发起新的 API 请求。
我想测试一下是否是缓存问题,或者我必须进行更深入的调试。
有没有办法告诉 Volley 不要使用缓存的请求数据,而是向 API 发起新请求?类似于 don't use cached data, but make a new request
。
注意:我不想删除整个缓存。我只想告诉 Volley 什么时候向 API 发起一个全新的请求。
我以前也遇到过同样的问题,但你可以用这个来改变它
request.setShouldCache(false);
myQueue.add(request);
IMO,如果您的项目使用 Google 的 volley 作为模块(不是 jar 文件),您可以自定义其 classes,如下所示:
选项#1:
第一个文件,RequestQueue.java:
添加一个class变量private boolean mCacheUsed = true;
和以下构造函数:
public RequestQueue(Cache cache, Network network, int threadPoolSize,
ResponseDelivery delivery, boolean cacheUsed) {
mCache = cache;
mNetwork = network;
mDispatchers = new NetworkDispatcher[threadPoolSize];
mDelivery = delivery;
mCacheUsed = cacheUsed;
}
public RequestQueue(Cache cache, Network network, int threadPoolSize, boolean cacheUsed) {
this(cache, network, threadPoolSize,
new ExecutorDelivery(new Handler(Looper.getMainLooper())), cacheUsed);
}
public RequestQueue(Cache cache, Network network, boolean cacheUsed) {
this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE, cacheUsed);
}
然后,在 public <T> Request<T> add(Request<T> request) {
中,您检查如下:
// If the request is uncacheable, skip the cache queue and go straight to the network.
if (!request.shouldCache() || !mCacheUsed) {
mNetworkQueue.add(request);
return request;
}
第二个文件,Volley.java:
public static RequestQueue newRequestQueue(Context context, HttpStack stack, boolean cacheUsed) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network, cacheUsed);
queue.start();
return queue;
}
public static RequestQueue newRequestQueue(Context context, boolean cacheUsed) {
return newRequestQueue(context, null, cacheUsed);
}
最后在MainActivity中,例如:
如果要使用可用缓存:
RequestQueue requestQueue = Volley.newRequestQueue(this, true);
如果不想使用可用缓存:
RequestQueue requestQueue = Volley.newRequestQueue(this, false);
选项#2:
Request.java:
添加一个class变量public boolean mSkipAvailableCache = false;
RequestQueue.java:
在public <T> Request<T> add(Request<T> request)
里面,你检查如下:
// If the request is uncacheable, skip the cache queue and go straight to the network.
if (!request.shouldCache() || request.mSkipAvailableCache) {
mNetworkQueue.add(request);
return request;
}
MainActivity.java: 您可以设置
jsonArrayRequest.mSkipAvailableCache = true;
可用的缓存将不会被使用。 希望这对您有所帮助!