[英]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.