实现原理
1.随便打开一个网址,查看网页源码,网页中都有如上的一些链接,想打开网址必然要加载完网页中的那些链接。但是加载那些文件需要时间,因此加载webview就会变慢。那如果我把那些需要加载的文件换为本地的,直接获取,打开网页是不是就省好多时间,一下子就提升了网页的打开速度。
2.由于App中存在一类H5的布局样式相同,所以可以做一个模板,架子一样,填的具体内容不同。
原理:加载模版,利用本地文件直接返回给网页模板需要加载的文件,加载好后只需更改显示内容。
注意:由于担心网络问题,可能文件数据包下载不下来,故会在开启App的时候返回一个保险html的网址,当本地没有数据包的时候,则加载保险html。
实现步骤
1.从后端下载开启WebView需要的相关文件数据包(网页中需要请求的文件)以及模板html,存储在本地
2.初始化webview
3.注入方法,实现android和js的交互,后端通过调用移动端的方法获得网页显示的具体内容
4.加载本地模板html文件
5.实施拦截操作,返回模板html需要的资源文件
拦截操作有两种情况:一种是直接返回本地文件,另一种则是加载url返回加载结果(因为当替换完url后,此方法并不会主动加载url,故需要自己请求加载,最后将返回的数据返回才可以)。
wv_news.setWebViewClient(new WebViewClient() { 省略无用的···· @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { //根据版本号更新数据包 String version = PrefUtils.getString(context, "code", ""); File file = null; Uri uri = Uri.parse(url); //abc 自定义的协议名,为方便替换 if (uri.getScheme().equals("abc")) { String picName = url.substring(url.lastIndexOf("/") + 1);//文件名 String suffix = picName.substring(picName.indexOf(".") + 1);//后缀 //path 为根据拦截的数据拼接成的本地文件地址,利用匹配到的本地文件替换源文件中的 file = new File(path); if (!file.exists()) { //保险文件地址,万一存储的文件出了问题,救急用的 url = getBaseUrl() + suffix + "/" + picName; return getDataWeb(url); } else { FileInputStream fis = null; try { fis = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } WebResourceResponse response = new WebResourceResponse( MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)) , "UTF-8", fis); return response; } } return super.shouldInterceptRequest(view, url); } }); } }
加载保险地址的内容返回的数据
public static WebResourceResponse getDataWeb(String newUrl) { HttpURLConnection conn = null;//声明连接对象 try { URL url = new URL(newUrl); //URL对象 conn = (HttpURLConnection) url.openConnection(); //使用URL打开一个链接,下面设置这个连接 conn.setRequestMethod("GET"); //使用get请求 if (conn.getResponseCode() == 200) {//返回200表示连接成功 String contentType = conn.getContentType(); if (contentType != null) { String mimeType = contentType; if (contentType.contains(";")) { mimeType = contentType.split(";")[0].trim(); } return new WebResourceResponse(mimeType, conn.getContentEncoding(), conn.getInputStream()); } } } catch (IOException e) { e.printStackTrace(); } return null; }
然后完成操作!
为了方便前后端的方法调用,此次采用的方案是利用Dsbridge加载网页DSBridge官方文档。
喵印~~~
作者:喵主子的阳光
链接:https://www.jianshu.com/p/abd51329b4f5
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦