【问题标题】:Retrofit http Cache-control check send back Cache even if stale and make network call again改造http缓存控制检查即使陈旧也发回缓存并再次进行网络调用
【发布时间】:2017-01-16 06:49:54
【问题描述】:

我正在使用 Retrofit 1.9.+ 和 okhttp:2.2.+。

我想缓存我的回复。我用 Okclient 拦截器做到了如下:

public abstract class RestController {
private static Context mContext;
private static long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MB

public static RestAdapter mRestAdapter;

public static void init(final Context context, String baseAPIUrl) {
    mContext = context;

    // Create Cache
    Cache cache = null;
    try {
        cache = new Cache(new File(mContext.getCacheDir(), "http"), SIZE_OF_CACHE);
    } catch (IOException e) {
        Log.e(RestController.class.getSimpleName(), "Could not create Cache!", e);
    }

    // Create OkHttpClient
    OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setCache(cache);
    okHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
    okHttpClient.setReadTimeout(30, TimeUnit.SECONDS);

    // Add Cache-Control Interceptor
    okHttpClient.networkInterceptors().add(mCacheControlInterceptor);

    // Create Executor
    Executor executor = Executors.newCachedThreadPool();

    mRestAdapter = new RestAdapter.Builder()
            .setEndpoint(baseAPIUrl)
            .setExecutors(executor, executor)
            .setClient(new OkClient(okHttpClient))
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();
}

private static final Interceptor mCacheControlInterceptor = new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        // Add Cache Control only for GET methods
        if (request.method().equals("GET")) {
            if (isNetworkAvailable()) {
                // 1 day
                request.newBuilder()
                        .header("Cache-Control", "only-if-cached")
                        .build();
            } else {
                // 4 weeks stale
                request.newBuilder()
                        .header("Cache-Control", "public, max-stale=2419200")
                        .build();
            }
        }

        Response response = chain.proceed(request);

        // Re-write response CC header to force use of cache
        return response.newBuilder()
                .header("Cache-Control", "public, max-age=86400") // 1 day
                .build();
    }
};

public static Boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo == null) {
        return false;
    }
    NetworkInfo.State network = networkInfo.getState();
    return (network == NetworkInfo.State.CONNECTED || network == NetworkInfo.State.CONNECTING);
}

}

现在我需要实现一个返回缓存的逻辑。我的缓存需要有两个指标: 1个新鲜的_upto 2 扔掉

那么逻辑就像 if(cache is present and current time <live upto){ send back cache } else if(current time<throwawaytime and current time >live upto){ send back cache make another network call onresponse send the new data back }

如何通过缓存控制来实现这一点。我可以为此使用 max-age 或 max-stale 吗?

【问题讨论】:

  • 您好,您的问题解决了吗?我需要类似的解决方案
  • @MayuriRuparel 抱歉,我已经为我的响应实现了 SQLite 缓存来实现这一点。我不确定是否可以使用 Retrofit..

标签: android retrofit okhttp cache-control


【解决方案1】:

试试这个在我的项目中进行改造

@Headers("Cache-Control: max-age=" + (MINUTE)) @GET("your Url") Call<ResponseBody> getCourseStructureFromCache("Your Request paramater and all");

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多