只要有okhttp3.Response
(retrofit2.Response.raw()
),就可以检查响应是否来自缓存.
引用Jesse Wilson的话:
有几个组合.
仅限.networkResponse() - 您的请求仅来自网络.
.cacheResponse() 只 -你的请求是从缓存中提供完全.
.networkResponse()和.cacheResponse() - 您的请求是条件GET,因此标头来自网络,正文来自缓存.
因此,对于您的示例,该isFromCache
方法将如下所示:
boolean isFromCache(Result> result) { return result.response().raw().networkResponse() == null; }
解决方案1:
通过使用okhttp3.Response.cacheResponse(),您可以检查是否从缓存接收到响应:
返回从缓存接收的原始响应.如果此响应未使用缓存,则为null
要从您的改造响应使用中获取原始的OkHttp响应.raw()
.即:
public boolean isFromCache(Result> retroResult) { return retroResult.response().raw().cacheResponse() != null; }
解决方案2:
您可以通过以下方式将Interceptor添加到OkHttp客户端new OkHttpClient.Builder().addInterceptor(...)
.在这个Interceptor中通过检索响应chain.proceed(chain.request)
.然后Response.cacheResponse()
分别使用Response.networkResponse()
以确定响应来自何处.
完整代码:
new OkHttpClient.Builder().addInterceptor(chain -> { Response response = chain.proceed(chain.request()); if (response.cacheControl() != null) { // from cache } else if (response.networkResponse() != null) { // from network } return response; });