最近做了一个资源缓存,将webview加载的网页中的资源缓存到手机上。当加载webview时,用手机中的资源替换请求的资源。
方案
每次打开APP,在手机保存一份需要缓存的url和一个版本号。通过map(url,ver)保存到手机。通过webview的方法shouldInterceptRequest()拦截到需要保存的url,将网页的资源保存到手机上。之后每次进入APP,比较ver,看是否需要更新资源。
流程
每次开启app,服务器传一份需要保存的资源,对应url和ver。将数据保存到手机。
之后每次打开app下载到的数据都需要跟之前保存的数据进行比较,看是否需要资源的替换。
将第一次保存的数据看做 localMap(url,ver),以后每次打开的app保存的数据看做netMap(url,ver)。
shouldInterceptRequest(WebView view, String url){
//拦截到请求的url
for(遍历netMap){
if(新的URL == 拦截的url){
//说明这个url使我们需要关心的,接着跟localMap中的url做比较,看是否需要更新
for(遍历localMap){
if(旧的url == 新的url){
比较新的ver和旧的ver是否相同
if(不一样){
将路径的资源下载到手机
将旧的ver改成新的
}
else if(手机上没有这个资源){
将路径的资源下载到手机
}
这时已经将资源下载到了手机,用手机中的资源替换webview请求的资源
}
}
}
}
}
//将资源保存到手机
public void downtoPhone(String url, String filename) {
try {
URL u = new URL(url);
InputStream is = u.openStream();
File file = new File(getDiskCacheDir(PlayGameActivity.this), filename);
OutputStream os = new FileOutputStream(file);
byte[] buff = new byte[1024];
int hasRead = 0;
while ((hasRead = is.read(buff)) > 0) {
os.write(buff, 0, hasRead);
}
is.close();
os.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//资源存储的文件位置
public String getDiskCacheDir(Context context) {
String cachePath = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}
//用手机本地资源替换webview请求的资源
FileInputStream fis = new FileInputStream(file);
response = new WebResourceResponse(资源对应的mime类型, "UTF-8", fis);