java.lang.IllegalStateException: cache is closed
我在用okhttp请求时出现了此异常,在华为6.0系统上必现,在小米5.0系统上不会出现 .暂时没有更多手机测试.
复现步骤编译好程序后首页加载完成后再进入任何一个有网络请求的页面就会出现然后闪退,再重新打开app就不会出现,去设置里清除数据后,又会出现,
也就是安装此程序后(运行正常),却设置里清除数据,在打开app就会出现此异常。
- 都说是因为response.body().string()不能多次调用出现此异常,但是我出现这种异常好像不是那个原因。
- 发现在okhttp缓存目录里有个 journal文件 我把此文件删掉后再清除数据就没有出现此异常
- https://img-blog.csdn.net/20170829161146815?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9uZ2JlaXRjeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okhttp日志拦截器 设置这个拦截器缓存文件夹里就会出现那个文件,不知道这个文件怎么影响到清除数据后有的手机在运行会出现java.lang.IllegalStateException: cache is closed异常。目前我在上线前去掉此拦截器,没找到很好解决方案。
- 下面是完成配置代码:
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
File cacheFile = SDCardUtils.getCacheFile();
Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(31000, TimeUnit.MILLISECONDS)
.connectTimeout(31000, TimeUnit.MILLISECONDS)
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(interceptor)
.cookieJar(new CookieJar() {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url.toString(), cookies);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
return cookies != null ? cookies : new ArrayList<Cookie>();
}
})
.cache(cache)
.build();
static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!NetUtil.checkNet(MainApp.getInstance())){
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
Response originalResponse = chain.proceed(request);
if (NetUtil.checkNet(MainApp.getInstance())){
String cacheControl="Cache-Control:public,max-age=0";
return originalResponse.newBuilder()
.header("Cache-Control", cacheControl)
.removeHeader("Pragma")
.build();
}else{
int maxStale = 60 * 60 * 24 * 28;
return originalResponse.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
}
};