OkHttp缓存如何工作?

问题描述 投票:0回答:1

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

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

我正在查看的文档在他们的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部分的摘录

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

让多个缓存同时访问同一缓存目录是错误的。大多数应用程序应该只调用一次新的OkHttpClient(),使用它们的缓存配置它,并在任何地方使用相同的实例。否则,两个缓存实例将相互踩踏,破坏响应缓存,并可能导致程序崩溃。

java okhttp3 okhttpclient
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.