最近有一个新需求,用手机流量的时候,webview加载页面的时候速度不是很快,能不能将静态文件缓存到sd卡呢,然后下次再访问这个网页的时候,把上次缓存的静态文件从sd卡拖拽过来,不走流量了,这样既省了流量,又让加载速度提升了。下面来写一个小测试吧(js放在在asseat里面)~
shouldinterceptrequest 在api11开始,shouldinterceptrequest被引入,可以解决这一类问题,这个方法可以通知app从本地加载指定的资源,而并非从网络中加载。
webview请求回网络,返回响应的数据,再调用shouldinterceptrequest方法来替换webview自行加载网络数据的方法,使用app所提供本地数据。webresourceresponse需要指定mime类型,编码格式。
webview.setwebviewclient(new webviewclient() { { @override public webresourceresponse shouldinterceptrequest(webview view, string url) { return replacejs(view, url); } }); protected webresourceresponse replacejs(webview view, string url) { if (url.startswith(http://img1.cache.netease.com/f2e/lib/js/ne.js)) { return new webresourceresponse(text/html, utf-8, filetool.streamfromasset(this, js/hlct-com.js)); } else { return null; } }public class filetool { public static inputstream streamfromasset(final context ctx, final string file) { try { return ctx.getassets().open(file); } catch (exception ignored) { } return null; }}
通过以上的代码就可以对webview中的js资源替换掉了。但加快网页打开的同时会增加app的apk包的大小(资源都放在本地了),空间换时间(时间换空间)的选择就看你的了。