使用okhttp的缓存功能
okhttp有一个功能就是适配http协议里面cache-control头
但是在实际使用的过程中,发现非文本内容,如果不对Response中的inputstream读取,就不会缓存下来
比如使用如下代码读取后才能缓存到cache目录
ResponseBody body = response.body();
if (body != null && response.isSuccessful()) {
long totalLength = body.contentLength();
BufferedInputStream bin = new BufferedInputStream(body.byteStream());
int size = 0;
int len = 0;
int percent = 0;
byte[] buf = new byte[1024];
while ((size = bin.read(buf)) != -1) {
len += size;
if (totalLength > 0) {
int temp = (int) (((float) len / (float) totalLength) * 10);
if (percent != temp) {
percent = temp;
TLog.d(TAG, "downloading---->" + percent);
}
}
}
try {
bin.close();
} catch (Exception e) {
TLog.e(TAG, e);
}
}
分析了一下源码,记录一下原因
主要是CacheInterceptor中intercept方法
133行附近有一个cache.put方法
cache.put返回的是cacheRequset
从Cache.kt文件中可以找到
返回的是RealCacheRequest
然后就是cache.put下面的
cacheWritingResponse
最后
这里解释了为什么要读流的时候才会写入缓存了