OKHTTP - 设置缓存后如何缓存某些改进的http响应

时间:2015-12-14 23:29:47

标签: android caching retrofit okhttp

要在android okhttp中缓存我设置了以下代码:

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 个答案:

答案 0 :(得分:1)

只是为了让您知道此答案正在使用Retrofit 2 beta。出于这个答案的目的,没有太大区别。

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

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("/users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);

}

快乐的编码。