当前位置: 首页 > 知识库问答 >
问题:

可以在脱机时使用缓存数据用OKHttp进行改装吗

冯元徽
2023-03-14
File httpCacheDirectory = new File(context.getCacheDir(), "responses");

HttpResponseCache httpResponseCache = null;
try {
     httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024 * 1024);
} catch (IOException e) {
     Log.e("Retrofit", "Could not create http cache", e);
}

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setResponseCache(httpResponseCache);

api = new RestAdapter.Builder()
          .setEndpoint(API_URL)
          .setLogLevel(RestAdapter.LogLevel.FULL)
          .setClient(new OkClient(okHttpClient))
          .build()
          .create(MyApi.class);
public interface MyApi {
   @Headers("Cache-Control: public, max-age=640000, s-maxage=640000 , max-stale=2419200")
   @GET("/api/v1/person/1/")
   void requestPerson(
           Callback<Person> callback
   );

编辑:由于OKHttp 2.0.xHttpResponSecacheCacheSetResponSecacheSetCache

共有1个答案

郗浩言
2023-03-14

OkHttp拦截器是脱机时访问缓存的正确方式:

1)创建拦截器:

private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
    @Override public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());
        if (Utils.isNetworkAvailable(context)) {
            int maxAge = 60; // read from cache for 1 minute
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, max-age=" + maxAge)
                    .build();
        } else {
            int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .build();
        }
    }

2)安装客户端:

OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);

//setup cache
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(httpCacheDirectory, cacheSize);

//add cache to the client
client.setCache(cache);
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
        File httpCacheDirectory = new File(context.getCacheDir(), "responses");

        Cache cache = null;
        try {
            cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
        } catch (IOException e) {
            Log.e("OKHttp", "Could not create http cache", e);
        }

        OkHttpClient okHttpClient = new OkHttpClient();
        if (cache != null) {
            okHttpClient.setCache(cache);
        }
        String hostURL = context.getString(R.string.host_url);

        api = new RestAdapter.Builder()
                .setEndpoint(hostURL)
                .setClient(new OkClient(okHttpClient))
                .setRequestInterceptor(/*rest of the answer here */)
                .build()
                .create(MyApi.class);
RestAdapter.Builder builder= new RestAdapter.Builder()
   .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (MyApplicationUtils.isNetworkAvailable(context)) {
                int maxAge = 60; // read from cache for 1 minute
                request.addHeader("Cache-Control", "public, max-age=" + maxAge);
            } else {
                int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                request.addHeader("Cache-Control", 
                    "public, only-if-cached, max-stale=" + maxStale);
            }
        }
});
 类似资料:
  • 问题内容: 我正在尝试使用Retrofit&OKHttp来缓存HTTP响应。我遵循了这个要点,并最终获得了以下代码: 这是MyApi,带有Cache-Control标头 首先,我在线请求并检查缓存文件。正确的JSON响应和标头在那里。但是,当我尝试离线请求时,我总是得到。我还需要做些其他事情来使Retrofit从缓存中读取响应吗? 编辑: 由于是是 问题答案: 编辑改造2.x: 是脱机时访问缓存的

  • 问题内容: 我已经在中解析了JSON数据,现在想使其脱机使用。有没有一种方法可以将JSON数据保存在电话上,以便在电话离线时可以查看数据? 有人知道一个例子吗? 编辑现在可以使用: 问题答案: 您有两种方法。您可以创建一个数据库,然后将所有数据保存在那里,并在需要时将其取回。或者,如果您拥有的数据不是很多,并且您不想处理数据库,那么您可以将json字符串写入存储卡中的文本文件,并在离线时稍后阅读。

  • 我希望有人能对我一直在研究但没有取得多大进展的一些事情有所帮助。 我想利用 NSURLCache 来返回我在 iOS 应用程序中进行的 API 调用的缓存响应。当设备联机时,如果缓存的响应足够新,我想返回它,否则从远程获取。当设备脱机时,我希望立即返回缓存的响应(如果有),无论其年龄如何。 我正在使用AFNetworking。我正在对我控制的服务器进行API调用。协议是HTTPS。响应头当前为。我

  • 我正在尝试使用改装2发出POST请求。请求类型是而不是。 我只是发布数据,而不是请求中的文件,响应是JSON的形式。 我尝试了,但它不起作用。 我已经尝试按照要求 1.第一次尝试 2.第二次尝试 3.第三次尝试 我只得到了空的身体。它正在和邮递员一起工作。 我也搜索了和,发现如果数据是二进制的,则使用,如果数据是ASCII,则使用 我试图找到表单数据是否不支持改造? POSTMAN请求 我只能添加

  • 我有一个简单的用例,服务器为请求返回Etag,并将该Etag作为标头(即)添加到所有后续url请求。如果响应中有变化,服务器可以用响应,否则可以用响应。对于后者,重用缓存中的响应是有意义的。但是okhttp总是返回作为缓存响应。 我做了一些故障排除,okhttp在内部将响应写入磁盘,但是不会将其返回到。仔细研究类,有一些文档明确说明不会使用缓存: 编辑-更正,Okhttp正确地添加了etag标头。

  • 我在使用AFNetworking和ETag值实现缓存时遇到问题。我的服务器为每个请求返回Cache-Control和ETag头值。但如果我再次请求相同的资源,AFNetworking将不会添加ETag。我应该手动保存每个响应的etag并将其附加到下一个请求吗? 在应用程序委托中,我已经设置了缓存对象: 另外,我使用的是AFHTTPRequestSerializer的默认缓存策略。 有什么想法吗?问