WebView的优化

WebView启动过程大概分为一下几个阶段:

注意:在APP中打开WebView的第一步并不是建立连接,而是启动浏览器内核。

以下通过加载流程各节点耗时分析优化

1 WebView创建初始化

首次初始化WebView的时间会比较长。初始化后,即使WebView已释放,但一些WebView共用的全局服务/资源对象仍未释放,之后初始化不需要生成,因此初始化变快。

可以在客户端启动的时候,就初始化一个全局的WebView,这种方法可以比较有效的减少WebViewAPP中的首次打开时间。但是,这也带来了一些问题, 额外的内存消耗;页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。

代码如下所示:

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和本地图片自检的关联,根据一定策略保证本地预置资源为最新资源。若预置资源不限于图片资源,由于htmljscss等资源容易发生变化,因此还需实现一套机制实现本地资源和服务端数据及时的更新。即服务端需要支持版本控制和资源增量下发等功能。

服务端下发填充好首屏数据的网页,作为网页首屏展示,减少网页上数据请求时间。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.comIP,这样用户打开WebView时就在DNS上耗费了时间。

DNS会在系统级别进行缓存,对于WebView的地址,如果使用的域名与APPAPI相同,则可直接使用缓存。

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的优化相关推荐

  1. Android—WebView加载速度优化工程实践

    一.混合开发的优势与缺陷 在混合开发大行其道的今天,很多页面和功能都转由前端实现,客户端只要在APP中嵌入一个WebView即可,同时前端开发的页面对于Android和iOS端的效果是统一的,省去了适 ...

  2. android 无障碍 webview,Android WebView使用

    原标题:Android WebView使用 前言 Android内置webkit内核的高性能浏览器,而WebView则是在这个基础上进行封装后的一个 控件,WebView直译网页视图,我们可以简单的看 ...

  3. Android WebView及WebView的神坑之旅

    WebView的一些神坑 最近在开发过程中遇到一个问题,主要是WebView页面,需要调用本地相机拍照及图库,遇到一系列的神坑,这里结合本人所查阅的资料给大家一一说明. 进入正题,首先来了解webvi ...

  4. android创建webview,Android Webview总结

    这些都是曾经收集到的一些关于Webview的知识,有些工作中用到了,有些暂时还没有用到,这次统一整理下,希望对自己,对大家有所帮助.另外,欢迎大家补充(当然,有错也要指正呀,不胜感激),如果可以的话, ...

  5. 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 ...

  6. android url webview,android - webview获取到当前页面的url

    android - webview获取到当前页面的url 2017-10-23 08:54 访问量: 2958 分类: 技术 使用 webview.getUrl() 即可. 可以完美返回  a.com ...

  7. 五十种巧妙优化SQL Server数据库

    五十种巧妙优化SQL Server数据库的方法:出现性能问题的原因- 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 没有创建计算列导致查询不 ...

  8. android webview java_Android WebView Java和JS通信

    前言: Android开发中,经常使用WebView来加载网页,而和WebView进行交互全部通过Java和Js互相调用来完成的.这篇文章就主要学习这块的知识. 本示例中,主要解决以下问题: Java ...

  9. Android面试题(五)性能优化·1

    五.性能优化 根据用户的四个方面需求,总结如下: 追求流畅,防止卡顿 追求稳定,防止闪退 追求续航,防止耗损 追求精简,防止臃肿 常见性能检测工具:网易开源的Emmagee.腾讯开源的GT.科大讯飞的 ...

  10. Android WebView(一) WebView详解

    WebView,在Android开发中,我们总是会遇到,它是Google封装的,使用WebKit渲染引擎加载显示网页.接下来,我们就详细看看WebView的介绍以及使用.如果你想了解WebView主要 ...

最新文章

  1. 异常信息: java.lang.ClassNotFoundException: org.aspec
  2. C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换
  3. Cocos2d-x 3.0final 终结者系列教程03-源代码文件夹说明
  4. zbb20171013 mysql服务重启 重启服务 重启mysql服务
  5. HTML加固5——汇总
  6. SAP Spartacus 懒加载 Customized CMS Component 的问题
  7. chameleon 算法_为了简单起见,Arquillian Chameleon
  8. 计算机基础教育学,计算机基础教育教学改革与创新
  9. 索尼中国官微吐槽年假被狗吃了 官方称系统故障 理解孩子
  10. 云计算实战系列-磁盘阵列
  11. zabbix 安装(yum)
  12. OSGB 倾斜摄影数据生产完成后裁剪模型问题
  13. 手机163邮箱发送服务器端口,163邮箱发送端口
  14. 「米聊」突然复活,雷布斯真的是出其不意
  15. project——项目管理工具
  16. 一种快速简单而又有效的低照度图像恢复算法
  17. 应用层与HTTP协议
  18. Firefox火狐浏览器web开发调试开启强制刷新缓存模式
  19. 十 三 弟 你 快 回 来 吧, 皇 帝 四 哥 叫 你 一 起 学 习 大 数 据 呢
  20. 风和日丽,幸福如草场广袤无边

热门文章

  1. OpenGL画自行车+菜单设置(附源码)
  2. 使用idb操作IndexedDB
  3. (一)数据后端之逻辑综合
  4. 颜值爆表!Redis 官方客户端工具,功能强大,且支持可视化监控!
  5. am335x硬件定时器使用
  6. 一篇文章搞定嵌入式看门狗watch dog概述与示例代码
  7. 笛卡尔坐标系和极坐标系的互相转换
  8. Linux【shell】 shell编程
  9. Java实现Redis的列表(List)命令
  10. “汉语编程”是解决安全问题的终极之路?