1.webview 打开sd卡上的静态html文件 ,js文件既然放在assets文件夹下能找到,那能通过放在sd卡,能加载吗?
答:事实证明,是没有用的。
2.既然能拿到html的数据,那我们是不是重写html的script的tag的src属性呢,前缀由我们动态地添加,是不是可以做到呢?
答:设定html中的js的路径为:这样在Android中,可以取得这个 script标签,然后修改src的值:
private String updateTags(String html) {
Document doc = Jsoup.parse(html, "UTF-8");
Elements eles = doc.getElementsByTag("script");
for (Element e : eles) {
e.attr("src","file:///android_asset"+e.attr("src"));
}
return doc.toString();
}
修改如上代码: bundle.putString("html",html);-->bundle.putString("html",updateTags(html) );
亲测,这个是可以用的。但是在加载html的时候,需要用data的方式的进行加载。这样,我们在html中,然后拿到script标签,修改src的值,各自拿到自己路径的js文件,这样就可以达到用网络的html但是用本地的js进行加载了。但是很明显这样的话,如果我们有多个script标签,有些需要增加前缀,有些不要,那这样的话,就需要设定一定的匹配规则了。
3.我们能不能通过执行js脚本,达到将js文件注入到html文件当中去,然后再由浏览器进行解释执行呢?
private void injectScriptFile(WebView view, String scriptFile) {
InputStream input;
try {
input = getAssets().open(scriptFile);
byte[] buffer = new byte[input.available()];
input.read(buffer);
input.close();
String js = new String(buffer);
view.loadUrl("javascript:" + js);
} catch (IOException e) {
e.printStackTrace();
}
}
});
if(mUrl.contains("isjs=1")) {
injectScriptFile(mWebview, "zepto_1.1.3.js");
}
mWebview.loadUrl(mUrl);
在加载url的html页面之前,可以执行js的注入。
4.细看webview的api,我们会发现,Android系统有提供给我们对应的api进行资源拦截,
webView.setWebViewClient(new WebViewClient() {
/**
*
* @return 本地jquery
*/
private WebResourceResponse editResponse() {
try {
return new WebResourceResponse("application/x-javascript", "utf-8", getAssets().open("webview.js"));
} catch (IOException e) {
e.printStackTrace();
}
//需处理特殊情况
return null;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.d(TAG, "shouldInterceptRequest: " + url);
if (Build.VERSION.SDK_INT < 21) {
return editResponse();
}
return super.shouldInterceptRequest(view, url);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= 21) {
String url = request.getUrl().toString();
if (!TextUtils.isEmpty(url)) {
return editResponse();
}
}
return super.shouldInterceptRequest(view, request);
}
});
这种能对资源文件进行本地的替换,以节省需要下载的流量,提升webview浏览的性能,这种方案对图片的替换也能很好的处理。
总结:基于上面第四种方案,我们就可以制定下发策略,本地更新策略,缓存策略,将资源存放本地,达到webview加载资源(图片,js,css等)可以先从本地获取,没有再从网络获取,并缓存到本地,提高在app中浏览网页的速度和用户体验。