WebView使用缓存的问题

来源:互联网 发布:ubuntu 14.04 输入法 编辑:程序博客网 时间:2024/05/08 13:48
1. webview加载静态资源使用缓存有两种方式:

方式一:使用ContentProvider,配置好uri匹配格式,重写contentprovider的openFile方法,网页引用资源的地方都使用配置好的uri替换掉http://,
假如uri设置为:content://com.wuba.hybrid.localfile
网页引用资源的方式:
这时候contentProvider的openFile方法会根据uri解析本地的文件返回给调用者即WebKit

这样就可以拦截网页的加载,使用本地资源去加载。但是不做任何处理的情况下,webview会一直记住该次返回的文件,相当于绑定了。如果这时候再进入同一页面,不会再重新被contentprovider拦截依然使用的是上次绑定的文件。除非再次进入该页面前加载了其他页面才有新的文件绑定给webview或者重新杀进程会清除webview绑定的文件。根据测试的结果猜测结论是这样:
页面加载后,该页面的所有资源绑定到webview上。加载其他页面就会清除该次绑定重新绑定新页面对应的资源,杀进程也会清掉webview的绑定行为

方式二:使用android3.0以上才有的方法:WebViewClient类的方法:

该方法使用本地文件输入流构建一个webresource去加载。如果是第一次加载某网页,在该方法中拦截url按照contentprovider处理方式回去本地资源文件对象,然后构建WebResourceResponse对象,也可以达到使用本地资源加载的目的。

该方式同方式一一样,也是绑定过一次不再继续拦截。

2. 如何解决?

上述两种方式的结果是:如果进入页面,该页面有资源更新,则先使用旧资源加载页面,然后后台线程下载新资源。待下次进入页面应该是使用新资源,但由于资源已经绑定到webview,故不会重新拦截仍然使用的是旧资源。这样会造成有资源更新一定几率是用不到的(除非更新完资源用户先进其他页面再进入资源更新过的页面才会生效,原因请见上文)
解决方案是在webview的销毁方法中调用webview.clearCache(boolean includeDiskfile)
该方法会清除一切webview的一切缓存。这样每次退出页面再进入,webview都不会有绑定好的文件,就每次都会拦截替换本地资源。