WebView(五)—— WebView的优化
WebView
的优化
WebView
启动过程大概分为一下几个阶段:
注意:在APP
中打开WebView
的第一步并不是建立连接,而是启动浏览器内核。
以下通过加载流程各节点耗时分析优化
1 WebView
创建初始化
首次初始化WebView
的时间会比较长。初始化后,即使WebView
已释放,但一些WebView
共用的全局服务/资源对象仍未释放,之后初始化不需要生成,因此初始化变快。
可以在客户端启动的时候,就初始化一个全局的WebView
,这种方法可以比较有效的减少WebView
在APP
中的首次打开时间。但是,这也带来了一些问题, 额外的内存消耗;页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。
代码如下所示:
public class App extends Application {@Overridepublic void onCreate() {super.onCreate();// 提前初始化,在Application中初始化WebView备用WebView mWebView = new WebView(new MutableContextWrapper(this));}
}
2 客户端代理数据请求
在客户端初始化WebView
的同时,直接由native
代码开始网络请求数据;当页面初始化完成后,向native
获取其代理请求的数据。 此方法虽然不能减小WebView
初始化时间,但数据请求和WebView
初始化可以并行进行,总体的页面加载时间就缩短了。
3 资源本地化
客户端预置资源,并维护网络图片url
和本地图片自检的关联,根据一定策略保证本地预置资源为最新资源。若预置资源不限于图片资源,由于html
、js
、css
等资源容易发生变化,因此还需实现一套机制实现本地资源和服务端数据及时的更新。即服务端需要支持版本控制和资源增量下发等功能。
服务端下发填充好首屏数据的网页,作为网页首屏展示,减少网页上数据请求时间。APP
闲置状态时,下载离线包到本地,加载时优先加载离线包数据。后续更新接收下发的差异包,与当前离线包合并成完整包。
方式一:JS
方法注入
// 1. 固定资源放到项目文件夹,如/Assets文件夹中
// 2. 注入JS方法webView.addJavascriptInterface(new JsInterface(), "JsInterface")
private class JsInterface { @JavascriptInterface public String getLocalSrc(String src) { return "file://storage/emulated/0/app/file/a.jpeg" }
}// 3. 页面加载完成时,修改图片标签
private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); String js = "javascript:(function() { " + "var objs = document.getElementsByTagName('img'); " + "for (var i = 0; i < objs.length; i++) { " + "var imgUrl = objs[i].getAttribute('src'); " + "var localUrl = window.local_obj.getLocalSrc(imgUrl); " + "if (localUrl) { " + "objs[i].setAttribute('src', localUrl); " + "} } })()"; view.loadUrl(js); }}
方式二:请求拦截
webView.setWebViewClient(new WebViewClient() { // 为方便,此处进写Api 21以下方法,Api21 以上雷同 @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { // 1. 判断拦截资源的条件 if (url.contains("logo.gif")) { // 假设网页图片资源为:http://abc.com/image/logo.gif // 图片资源文件名为:logo.gif // 2. 创建输入流 InputStream is = null try { // 3. 获得需要替换的资源(存放在assets文件夹中) is = getApplicationContext().getAssets().open("image/abc.png") } catch (IOException e) { e.printStackTrace() } // 4. 替换资源 WebResourceResponse reponse = new WebResourceResponse("image/png", "utf-8", is) return response }return super.shouldInterceptRequest(view, url)
}})
4 DNS
解析耗时
以美团为例,美团的客户端请求域名主要位于api.meituan.com
,然而内嵌的WebView
主要位i.meituan.com
。初次打开APP
时:客户端首次打开都会请求api.meituan.com
,其DNS
将会被系统缓存。然而当打开WebView
的时候,由于请求了不同的域名,需要重新获取i.meituan.com
的IP
,这样用户打开WebView
时就在DNS
上耗费了时间。
DNS
会在系统级别进行缓存,对于WebView
的地址,如果使用的域名与APP
的API
相同,则可直接使用缓存。
5 绘制渲染
布局绘制是一个递归过程,从呈现根节点开始,递归遍历子节点,计算几何集合信息。因此,html标签越复杂、嵌套越深,则布局耗时越久。
优化网页布局,减少布局层次。
参考
https://www.jianshu.com/p/0042813168f7
https://www.jianshu.com/p/56e2b0bf9ab2
https://www.jianshu.com/p/7a237e7f055c
https://blog.csdn.net/weixin_40438421/article/details/85700109
https://zhuanlan.zhihu.com/p/161964699
https://www.jianshu.com/p/7f99a0f040a6
https://www.jianshu.com/p/6179d51281da
WebView(五)—— WebView的优化相关推荐
- Android—WebView加载速度优化工程实践
一.混合开发的优势与缺陷 在混合开发大行其道的今天,很多页面和功能都转由前端实现,客户端只要在APP中嵌入一个WebView即可,同时前端开发的页面对于Android和iOS端的效果是统一的,省去了适 ...
- android 无障碍 webview,Android WebView使用
原标题:Android WebView使用 前言 Android内置webkit内核的高性能浏览器,而WebView则是在这个基础上进行封装后的一个 控件,WebView直译网页视图,我们可以简单的看 ...
- Android WebView及WebView的神坑之旅
WebView的一些神坑 最近在开发过程中遇到一个问题,主要是WebView页面,需要调用本地相机拍照及图库,遇到一系列的神坑,这里结合本人所查阅的资料给大家一一说明. 进入正题,首先来了解webvi ...
- android创建webview,Android Webview总结
这些都是曾经收集到的一些关于Webview的知识,有些工作中用到了,有些暂时还没有用到,这次统一整理下,希望对自己,对大家有所帮助.另外,欢迎大家补充(当然,有错也要指正呀,不胜感激),如果可以的话, ...
- android webview mailto,Webview email link (mailto)
问题 I have a view and view the site has malito code to send email. When I open the link opens in an e ...
- android url webview,android - webview获取到当前页面的url
android - webview获取到当前页面的url 2017-10-23 08:54 访问量: 2958 分类: 技术 使用 webview.getUrl() 即可. 可以完美返回 a.com ...
- 五十种巧妙优化SQL Server数据库
五十种巧妙优化SQL Server数据库的方法:出现性能问题的原因- 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 没有创建计算列导致查询不 ...
- android webview java_Android WebView Java和JS通信
前言: Android开发中,经常使用WebView来加载网页,而和WebView进行交互全部通过Java和Js互相调用来完成的.这篇文章就主要学习这块的知识. 本示例中,主要解决以下问题: Java ...
- Android面试题(五)性能优化·1
五.性能优化 根据用户的四个方面需求,总结如下: 追求流畅,防止卡顿 追求稳定,防止闪退 追求续航,防止耗损 追求精简,防止臃肿 常见性能检测工具:网易开源的Emmagee.腾讯开源的GT.科大讯飞的 ...
- Android WebView(一) WebView详解
WebView,在Android开发中,我们总是会遇到,它是Google封装的,使用WebKit渲染引擎加载显示网页.接下来,我们就详细看看WebView的介绍以及使用.如果你想了解WebView主要 ...
最新文章
- 异常信息: java.lang.ClassNotFoundException: org.aspec
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换
- Cocos2d-x 3.0final 终结者系列教程03-源代码文件夹说明
- zbb20171013 mysql服务重启 重启服务 重启mysql服务
- HTML加固5——汇总
- SAP Spartacus 懒加载 Customized CMS Component 的问题
- chameleon 算法_为了简单起见,Arquillian Chameleon
- 计算机基础教育学,计算机基础教育教学改革与创新
- 索尼中国官微吐槽年假被狗吃了 官方称系统故障 理解孩子
- 云计算实战系列-磁盘阵列
- zabbix 安装(yum)
- OSGB 倾斜摄影数据生产完成后裁剪模型问题
- 手机163邮箱发送服务器端口,163邮箱发送端口
- 「米聊」突然复活,雷布斯真的是出其不意
- project——项目管理工具
- 一种快速简单而又有效的低照度图像恢复算法
- 应用层与HTTP协议
- Firefox火狐浏览器web开发调试开启强制刷新缓存模式
- 十 三 弟 你 快 回 来 吧, 皇 帝 四 哥 叫 你 一 起 学 习 大 数 据 呢
- 风和日丽,幸福如草场广袤无边