使用Volley和OkHttp时如何配置Http Cache?

时间:2015-05-04 07:42:22

标签: android caching android-volley 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;
    }
}

https://gist.github.com/bryanstern/4e8f1cb5a8e14c202750

引用了哪个OkHttpClient

2 个答案:

答案 0 :(得分:17)

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开箱即用的默认行为是什么?

对于排球:

它将自动为您创建一个“齐射”默认缓存目录。

/** 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 Cache,因为它易于定制。

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

答案 1 :(得分:4)

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

request.setCacheControl(CacheControl.FORCE_NETWORK);