webview加载本地资源 | 您所在的位置:网站首页 › webview加载本地图片 › webview加载本地资源 |
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中浏览网页的速度和用户体验。 |
CopyRight 2018-2019 实验室设备网 版权所有 |