将 Volley 与 OkHttp 结合使用时如何配置 Http 缓存?

How to configure the Http Cache when using Volley with OkHttp?

我想尝试将 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

OkHttp是一种类似于HttpUrlConnection的HTTP客户端,它实现了HTTP缓存,我们可以像下面这样关闭OkHttp的缓存:

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

然后,我们可以保留一份由 Volley 维护的 HTTP 缓存。

改进:

我想尝试回答 Sotti 的问题。

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 缓存?

是的,我正在为我的 HTTP 缓存使用 Volley 缓存而不是 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:

在源码中找不到默认缓存,我们可以这样设置响应缓存post http://blog.denevell.org/android-okhttp-retrofit-using-cache.html

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

this post 所说:

Volley takes care of requesting, loading, caching, threading, synchronization and more. It’s ready to deal with JSON, images, caching, raw text and allow some customization.

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

例如,我们可以像这样对缓存有更多的控制 Android Volley + JSONObjectRequest Caching.

OkHttp忽略缓存的优雅方式是:

request.setCacheControl(CacheControl.FORCE_NETWORK);