改造缓存 404 响应
Retrofit cache 404 response
我正在使用 okhttp3 改造缓存,如本答案中所述:
,
这是我的拦截器
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
包中创建了 class。 (这很重要!)
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;
}
}
可能这会对某人有所帮助。
我正在使用 okhttp3 改造缓存,如本答案中所述: , 这是我的拦截器
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
包中创建了 class。 (这很重要!)
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;
}
}
可能这会对某人有所帮助。