OkHttp使用Volley时如何configurationHttpcaching?

我想尝试Volley与OkHttp结合,但是Volleycaching系统和OkHttp都依赖于HTTP规范中定义的HTTPcaching。 那么怎样才能禁用OkHttp的caching保留一个HTTPcaching的副本?

编辑:我做了什么

public class VolleyUtil { // http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/ private volatile static RequestQueue sRequestQueue; /** get the single instance of RequestQueue **/ public static RequestQueue getQueue(Context context) { if (sRequestQueue == null) { synchronized (VolleyUtil.class) { if (sRequestQueue == null) { OkHttpClient client = new OkHttpClient(); client.networkInterceptors().add(new StethoInterceptor()); client.setCache(null); sRequestQueue = Volley.newRequestQueue(context.getApplicationContext(), new OkHttpStack(client)); VolleyLog.DEBUG = true; } } } return sRequestQueue; } } 

从https://gist.github.com/bryanstern/4e8f1cb5a8e14c202750引用哪个OkHttpClient

Solutions Collecting From Web of "OkHttp使用Volley时如何configurationHttpcaching?"

OkHttp是一种像HttpUrlConnection这样的实现HTTPcaching的HTTP客户端,我们可以像下面那样禁用OkHttp的caching:

 OkHttpClient client = new OkHttpClient(); client.setCache(null); 

那么,我们可以保留一个由Volley维护的HTTPcaching副本。

改进:

我想尝试回答索提的问题。

1我想知道使用Volley和OkHttp时什么是一个好的caching设置。

在我的项目中,我在所有平静的API中使用了一个Volley requestQueue实例,OkHttp像Volley一样用作了传输层。

 public class VolleyUtil { // http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/ private volatile static RequestQueue sRequestQueue; /** get the single instance of RequestQueue **/ public static RequestQueue getQueue(Context context) { if (sRequestQueue == null) { synchronized (VolleyUtil.class) { if (sRequestQueue == null) { OkHttpClient client = new OkHttpClient(); client.setCache(null); sRequestQueue = Volley.newRequestQueue(context.getApplicationContext(), new OkHttpStack(client)); VolleyLog.DEBUG = true; } } } return sRequestQueue; }} 

2我们应该依靠Volley还是OkHttpcaching?

是的,我用我的HTTPcaching而不是OkHttpcaching使用Volleycaching; 这对我很有效。

3开箱即用的默认行为是什么?

对于排球:

它会自动为你创build一个“凌空”的默认caching目录。

 /** Default on-disk cache directory. */ private static final String DEFAULT_CACHE_DIR = "volley"; public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) { File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); …… } 

对于OkHttp:

我找不到源代码中的默认caching,我们可以像这样设置响应cachinghttp://blog.denevell.org/android-okhttp-retrofit-using-cache.html

4.什么是推荐的行为,以及如何实现?

正如这篇文章所说:

Volley负责请求,加载,caching,线程,同步等等。 它已经准备好处理JSON,图像,caching,原始文本,并允许一些定制。

我更喜欢使用Volley HTTP Cache,因为它易于定制。

例如,我们可以像这个Android Volley + JSONObjectRequest Caching一样对caching进行更多的控制。

OkHttp忽略caching的优美方式是:

 request.setCacheControl(CacheControl.FORCE_NETWORK);