簡體   English   中英

改裝緩存404響應

[英]Retrofit cache 404 response

我正在使用okhttp3改型緩存,如此答案中所述: https ://stackoverflow.com/a/23503804/6212796,這是我的攔截器

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();
        }
    }

http客戶端:

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

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

並且緩存工作正常,但是一旦我從服務器改造中獲得404響應,即使服務器再次恢復正常,該響應也將卡住。

這是服務器開啟時的日志: 在此處輸入圖片說明

這是服務器關閉時的響應: 在此處輸入圖片說明

並且當它再次出現時: 在此處輸入圖片說明

我在OkHttp 3.10.0中有相同的錯誤。 我通過手動從緩存中刪除響應來修復它。 我在okhttp3包中創建了類。 (這一點很重要!)

package okhttp3;

import android.content.Context;

import java.io.File;


class CacheUtil {
    static void remove(Context context, Request request) {
        try {
        Cache cache = new Cache(new File(context.getCacheDir(), "responses"), (10 * 1024 * 1024));//your cache folder
        cache.remove(request);
        } catch (Exception e) {
        }
    }
}

可以將其添加到您的改造調用隊列中,如下所示:

    call.enqueue(new Callback<City>() {
        @Override
        public void onResponse(Call<City> call, Response<City> response) {
            if(response.isSuccessful()) {
                //execute success code
            } else {
                if (response.code() == 404) {
                    CacheUtil.remove(context, response.raw().request());
                }
            }
        }

        @Override
        public void onFailure(Call<City> call, Throwable t) {
            //execute failure code
        }
    });

或者可以將其添加到攔截器(必須將其添加到OkHttpClient.Builder中),如下所示:

new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        if (response.code() == 404) {
            CacheUtil.remove(context, request);
        }
        return response;
    }
}

也許這會幫助別人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM