webview加载本地资源 您所在的位置:网站首页 webview加载本地图片 webview加载本地资源

webview加载本地资源

2022-03-23 14:42| 来源: 网络整理| 查看: 265

1.webview 打开sd卡上的静态html文件 ,js文件既然放在assets文件夹下能找到,那能通过放在sd卡,能加载吗?

bVTk0k?w=926&h=143

答:事实证明,是没有用的。

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中浏览网页的速度和用户体验。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有