使用 Volley 和 OkHttp 时如何配置 Http 缓存?
Posted
技术标签:
【中文标题】使用 Volley 和 OkHttp 时如何配置 Http 缓存?【英文标题】:How to configure the Http Cache when using Volley with OkHttp? 【发布时间】:2015-07-13 12:51:58 【问题描述】:我想尝试 Volley 与 OkHttp 的结合,但 Volley 缓存系统和 OkHttp 都依赖于 HTTP 规范中定义的 HTTP 缓存。那么如何禁用 OkHttp 的缓存来保留一份 HTTP 缓存呢?
编辑:我做了什么
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;
哪个OkHttpClient
引用自https://gist.github.com/bryanstern/4e8f1cb5a8e14c202750
【问题讨论】:
你能告诉我们你做了什么 @Soham 感谢您的回复,我重新编辑了我的问题,谢谢。 【参考方案1】:OkHttp 是一种类似于 HttpUrlConnection 的 HTTP 客户端,它实现了 HTTP 缓存,我们可以像下面这样禁用 OkHttp 的缓存:
OkHttpClient client = new OkHttpClient();
client.setCache(null);
然后,我们可以保留一份由 Volley 维护的 HTTP 缓存。
改进:
我想尝试回答索蒂的问题。
1 我想知道在使用 Volley 和 OkHttp 时,什么是好的缓存设置。
在我的项目中,我在所有 RESTful 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 还是 OkHttp 缓存?
是的,我将 Volley 缓存用于我的 HTTP 缓存而不是 OkHttp 缓存; 它对我很有用。
3 开箱即用的默认行为是什么?
对于排球:
它会自动为你创建一个“volley”默认缓存目录。
/** 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:
我在源代码中找不到默认缓存,我们可以像这篇文章一样设置响应缓存 http://blog.denevell.org/android-okhttp-retrofit-using-cache.html
4.推荐的行为是什么以及如何实现?
正如this 帖子所说:
Volley 负责请求、加载、缓存、线程、同步等。它已准备好处理 JSON、图像、缓存、原始文本并允许进行一些自定义。
我更喜欢使用 Volley HTTP 缓存,因为它易于定制。
例如,我们可以像这样对缓存进行更多控制 Android Volley + JSONObjectRequest Caching.
【讨论】:
【参考方案2】:OkHttp
忽略缓存的优雅方式是:
request.setCacheControl(CacheControl.FORCE_NETWORK);
【讨论】:
这仅适用于此处讨论的特定请求。 github.com/square/okhttp/issues/1496以上是关于使用 Volley 和 OkHttp 时如何配置 Http 缓存?的主要内容,如果未能解决你的问题,请参考以下文章
Android 网络库的比较:OkHTTP、Retrofit 和 Volley [关闭]
Android RxVolley = Volley + RxJava + OkHttp
Xutils, OKhttp, Volley, Retrofit对比