OkHttp缓存如何工作?

时间:2018-03-03 20:01:04

标签: java okhttp3 okhttp

我最近改变了现有的为每个标准单例客户端的请求创建新客户端的实现。

现在,当我开始阅读文档时,我发现还有一个叫做缓存的东西正在被使用。有一些内容表示,有多个缓存试图访问同一个缓存目录可能最终导致它们相互踩踏并导致崩溃。

我正在查看的文档在他们的github回购中:

okhttp recipes for regular issues faced

我的问题:

我没有专门为我的客户端设置任何缓存或缓存控制。只需几个超时值和一个连接池。如果我为每次调用使用新的请求和响应对象,默认情况下是否会进行任何缓存?

client = new Okhttpclient.Builder()
              . connectTimeout (10000,TimeUnit.MILLISECONDS)
              .readTimeout(15000,TimeUnit.MILLISECONDS)
              . connectionPool (new ConnectionPool ())
              .build();

上面的客户端设置为singleton并返回到所有调用的servlet。请求创建为

  Request req = new Request.Builder()
                  .url(someurl)
                  .get()
                  .build();

  Response res = client.newCall(req).execute();

如果是这样,是否会出现上述重要部分的问题。我根本不需要缓存,因为我只是把东西写到另一台服务器上,当我正在阅读时,我确实需要它是当前的值而不是缓存一个...所以我需要显式设置缓存-control设置为强制网络或我的默认设置是否相同?

编辑:这是文档Response caching部分的摘录

  

要缓存响应,您需要一个可以读取的缓存目录   并写入,并限制缓存的大小。缓存目录   应该是私有的,不受信任的应用程序应该不能   阅读其内容!

     

让多个缓存访问同一缓存是错误的   目录同时。大多数应用程序应调用new   OkHttpClient()恰好一次,用它们的缓存配置它,然后使用   到处都是同一个例子。否则两个缓存实例将   彼此踩踏,破坏响应缓存,并可能崩溃   你的计划。

1 个答案:

答案 0 :(得分:1)

为每个客户端实例设置OkHttp缓存目录。该文档告诉您的是,您不应将多个客户端配置为使用相同的缓存目录。必须明确启用缓存,并且在您的问题的代码段中未启用缓存。

在客户端实例上配置了缓存后,您可以控制每个请求的响应缓存。见Cache