2015-12-14 100 views
0

要缓存中的Android okhttp后,我有以下代码设置:OKHTTP - 设置高速缓存如何缓存某些改装HTTP响应

final @Nullable File baseDir = context.getCacheDir(); 
if (baseDir != null) { 
    final File cacheDir = new File(baseDir, "HttpResponseCache"); 
okHttpClient.setCache(new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE)); 
} 

这将设置我的缓存到一个目录下我叫HttpResponseCache。我现在如何缓存某个响应?我不想缓存所有改装回复只有选定的?

回答

1

只是为了让您知道这个答案是使用Retrofit 2测试版。为了这个答案的目的没有太大的区别。

我假设你有这样的东西来获得改造客户端。

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(API_BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(new ErrorHandlingCallbackAdapter.ErrorHandlingCallAdapterFactory()); 

我希望你也有这样的方法:

public static <S> S createCachedService(Context context, Class<S> serviceClass) { 

    Retrofit retrofit = builder.client(sOkHttpClient).build(); 
    return retrofit.create(serviceClass); 
} 

但你应该有这些方法2。一个增加了okhttp客户端,另一个没有。

public static <S> S createService(Context context, Class<S> serviceClass) { 

    Retrofit retrofit = builder.build(); 
    return retrofit.create(serviceClass); 
} 

无论何时只需要使用缓存服务创建者进行缓存调用。

我的理解是,如果您希望对该端点的所有请求都跳过缓存,则还可以向端点添加@Header注释。 okhttp应该尊重你的Cache-Control头。 类似于

public interface GitHubService { 

    @Headers("Cache-Control: no-cache") 
    @GET("https://stackoverflow.com/users/{user}/repos") 
    Call<List<Repo>> listRepos(@Path("user") String user); 

} 

快乐编码。