改造 – Okhttp客户端如何caching响应

我试图用OkHttp(2.3.0)cachingRetrofit(v 1.9.0)完成的http调用的响应。 如果我尝试在没有互联网的情况java.net.UnknownHostException打电话,则总是进行networking调用,然后是java.net.UnknownHostException

RESTClient实现

 public class RestClient { public static final String BASE_URL = "http://something.example.net/JSONService"; private com.ucc.application.rest.ApiService apiService; public RestClient() { Gson gson = new GsonBuilder() .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'") .create(); RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("Accept", "application/json"); int maxAge = 60 * 60; request.addHeader("Cache-Control", "public, max-age=" + maxAge); } }; RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setEndpoint(BASE_URL) .setClient(new OkClient(OkHttpSingleTonClass.getOkHttpClient())) .setConverter(new GsonConverter(gson)) .setRequestInterceptor(requestInterceptor) .build(); apiService = restAdapter.create(com.ucc.application.rest.ApiService.class); } public com.ucc.application.rest.ApiService getApiService() { return apiService; } } 

OkHttpSingleTonClass

 public class OkHttpSingleTonClass { private static OkHttpClient okHttpClient; private OkHttpSingleTonClass() { } public static OkHttpClient getOkHttpClient() { if (okHttpClient == null) { okHttpClient = new OkHttpClient(); createCacheForOkHTTP(); } return okHttpClient; } private static void createCacheForOkHTTP() { Cache cache = null; cache = new Cache(getDirectory(), 1024 * 1024 * 10); okHttpClient.setCache(cache); } public static File getDirectory() { final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "UCC" + File.separator); root.mkdirs(); final String fname = UserUtil.CACHE_FILE_NAME; final File sdImageMainDirectory = new File(root, fname); return sdImageMainDirectory; } } 

MyActivity

 Request request = new Request.Builder() .cacheControl(new CacheControl.Builder() .onlyIfCached() .maxAge(60 * 60, TimeUnit.SECONDS) .build()) .url(RestClient.BASE_URL + Constants.GET_ABOUT_US_COLLECTION + "?userid=59e41b02-35ed-4962-8517-2668b5e8dae3&languageid=488d8f13-ef7d-4a3a-9516-0e0d24cbc720") .build(); Log.d("url_request", RestClient.BASE_URL + Constants.GET_ABOUT_US_COLLECTION + "/?userid=10"); com.squareup.okhttp.Response forceCacheResponse = null; try { forceCacheResponse = OkHttpSingleTonClass.getOkHttpClient().newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } if (forceCacheResponse.code() != 504) { // The resource was cached! Show it. Log.d("From", "Local"); Toast.makeText(AboutUs.this, "Local", Toast.LENGTH_SHORT).show(); } else { // The resource was not cached. Log.d("From", "Network"); Toast.makeText(AboutUs.this, "Network", Toast.LENGTH_SHORT).show(); getAbouUsDetails();//This will use the Apiservice interface to hit the server. } 

我跟着这个 但我无法工作。 它只是从服务器上打。 我究竟做错了什么?

Solutions Collecting From Web of "改造 – Okhttp客户端如何caching响应"

根据使用OkClient Retrofit 1.9.0没有caching支持。 我们必须通过Square OkHttpClient库使用OkHttpClient实例。

你可以编译compile 'com.squareup.okhttp:okhttp:2.3.0'

在通过响应标题来改进caching之前

Cache-Control:max-age=120,only-if-cached,max-stale

** 120秒。

你可以在这里阅读更多关于标题。

caching标题主要由服务器响应指示。 尝试在服务器中实现caching头。 如果你没有select,是的改造了。

 private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); return originalResponse.newBuilder() .header("Cache-Control", String.format("max-age=%d, only-if-cached, max-stale=%d", 120, 0)) .build(); } }; 

在哪里caching:

 private static void createCacheForOkHTTP() { Cache cache = null; cache = new Cache(getDirectory(), 1024 * 1024 * 10); okHttpClient.setCache(cache); } // returns the file to store cached details private File getDirectory() { return new File(“location”); } 

将拦截器添加到OkHttpClient实例中:

 okHttpClient.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR); 

最后将OkHttpClient添加到RestAdapter中:

 RestAdapter.setClient(new OkClient(okHttpClient)); 

你可以通过这张幻灯片获取更多的参考。