`
CshBBrain
  • 浏览: 650033 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:144900
Group-logo
HTML5移动开发
浏览量:137834
社区版块
存档分类
最新评论

Android的WebView控件载入网页显示速度慢的究极解决方案

 
阅读更多
<!--文字内容-->

【转载请注明来源自http://hi.baidu.com/goldchocobo/

Android客户端中混搭HTML页面,会出现虽然HTML内容载入完成,标题也正常显示,但是整个网页需要等到近5秒(甚至更多)时间才会显示出来。研究了很久,搜遍了国外很多网站,也看过PhoneGap的代码,一直无解。

一般人堆WebView的加速,都是建议先用webView.getSettings().setBlockNetworkImage(true); 将图片下载阻塞,然后在浏览器的OnPageFinished事件中设置webView.getSettings().setBlockNetworkImage(false); 通过图片的延迟载入,让网页能更快地显示。

但是,通过实际的日志发现,Android的OnPageFinished事件会在Javascript脚本执行完成之后才会触发。如果在页面中使用JQuery,会在处理完DOM对象,执行完$(document).ready(function() {});事件自会后才会渲染并显示页面。如下图

可以看到在载入完最后一个JS脚本之后,对DOM元素的渲染和处理就花了8秒,然后执行了AJAX方法载入外部页面又花了2、3秒,最后才会触发onPageFinished显示页面。再往后由于程序中设置了setBlockNetworkImage(false),所以开始载入外部图片。(如果不控制这个参数,图片载入会在渲染期间下载。  综上,由于JS脚本的处理,造成了一张页面打开多花了10秒左右时间。而同样的页面在iPhone上却是载入相当的快,显示完页面才会触发脚本的执行。(提示:如果使用JQueryMobile,更会慢得离谱)

要解决这个问题,就是想办法让浏览器延迟加载JS脚本,但是Android的WebView控件没有这样的参数。无法单独阻塞JS脚本,另外有个setBlockNetworkLoads,用了之后也无法实现类似图片的异步载入的功能,页面成了光板,连CSS也阻塞了。

就是这个问题困扰了很久,直到在做HTML照片墙时,由于setBlockNetworkImage在OnPageFinished之后才会释放,导致在JS脚本载入图片过程中无法获取图片的高宽信息,最后巧妙地通过$(document).ready(function() {setTimeout(func,10)});,成功将函数在onPageFinished之后运行。那么延伸来想,是否可以将JS脚本也用同样的方式延迟载入呢?

答案是肯定的,在 http://wonko.com/post/painless_javascript_lazy_loading_with_lazyload 可以找到JS脚本延迟加载的第三方组件。

我改造了之前速度奇慢的界面,我所使用的核心JS代码如下:

<script src="/css/j/lazyload-min.js" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
  loadComplete() {
    //instead of document.read();
  } 
  function loadscript() {
    LazyLoad.loadOnce([
      '/css/j/jquery-1.6.2.min.js',
      '/css/j/flow/jquery.flow.1.1.min.js',
      '/css/j/min.js?v=2011100852'
      ], loadComplete);
  }
  setTimeout(loadscript,10);
</script>

 

就是混搭setTimeout和layzload,让JS脚本可以真正在onPageFinish之后执行。

最终执行的效果如图:

可以看到非常显著的改善,从onPageStarted到onPageFinished只用了2秒不到的时间,这个时间主要花在HTML和CSS渲染上。从界面上来看,就是一闪而过的网页载入进度条,立即显示CSS渲染过的页面效果,然后再载入并执行JS脚本,逐块显示需要通过AJAX获取的数据。

综上,解决Android载入WebView页面慢的问题,不是Android程序员的事情,而是Web前端工程师的问题。如果您使用基于WebView的Android第三方壳工具(例如PhoneGap,可以通过这种方式改善UI界面的响应时间)。

发布这个解决方案,希望基于Web的客户端解决方案能更上一层楼,让HTML和原生App混搭或的纯WebApp实现效果可以更理想,功德无量......

分享到:
评论

相关推荐

    Android WebView控件的用法

    在Android开发中,WebView控件是一个非常重要的组件,它允许我们在应用程序内部嵌入一个浏览器引擎,展示网页内容。这使得开发者能够实现与网页交互的功能,而无需离开应用本身,极大地提升了用户体验。下面我们将...

    android webview控件案例

    综上所述,"android webview控件案例"涵盖了WebView的基本使用,包括加载网页、处理链接点击、显示进度条、设置缓存策略以及JavaScript与原生应用的交互。通过这个案例,开发者可以深入理解WebView的工作原理,并在...

    android WebView控件的使用

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容。WebView控件的使用是Android开发者必须掌握的一项技能,尤其对于那些希望在应用中嵌入网页功能或者实现轻量级浏览器...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    Android webview加载网页.zip

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,无需跳转到外部浏览器。这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解...

    android 使用webview控件,注意在android9.0以后必须使用https才能访问网页

    在Android应用开发中,WebView控件是一个非常重要的组件,它允许开发者在应用程序内嵌入一个浏览器,以便用户能够浏览网页内容。然而,随着网络安全性的不断提升,Android系统对WebView的使用也有了更严格的要求。在...

    android webview input=file 失效解决方案

    在Android开发中,Webview是一个重要的组件,它允许我们在原生应用中内嵌网页内容,提供混合式应用的用户体验。然而,在使用Webview时,有时会遇到一个问题:当HTML页面中包含`&lt;input type="file"&gt;`用于上传文件的...

    Android WebView 去除标题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。有时候,我们可能希望去除WebView中的标题部分,以实现更自定义化的界面设计。本篇文章将详细探讨如何在Android的...

    android webview播放网页视频

    在Android开发中,Webview是一个非常重要的组件,它允许我们加载和展示网页内容。当涉及到在Webview中播放网页视频时,这个问题可能会变得稍微复杂,因为Android原生的Webview并不总是支持所有现代HTML5视频特性。...

    Android应用源码之38.WebView控件学习.zip

    在Android应用开发中,WebView控件是一个至关重要的组件,它允许开发者在应用程序内嵌入网页内容,实现浏览器的功能。这份源码提供了关于WebView的详细学习资料,非常适合Android开发者进行参考和学习。 首先,...

    android Webview读取网页里的所有图片,并实现点击放大

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。当涉及到用户界面交互,特别是展示包含图片的网页时,我们可能需要实现一些额外的功能,比如点击图片放大查看。本篇文章...

    Android WebView 实现缓存网页数据

    在Android开发中,`WebView` 是一个非常重要的组件,它允许开发者在应用程序内嵌入一个浏览器,用于显示网页内容。本篇文章将详细讲解如何利用 `WebView` 实现网页数据的缓存,使得在网络不稳定或者断开的情况下,...

    WebView控件基本使用 Android

    WebView 控件是 Android 中的一个浏览器控件,通过这个控件可以直接访问网页,或者把输入的 HTML 字符串显示出来。WebView 的功能非常强大,支持 CSS、Java script 等 HTML 语言,这样页面就能更漂亮。WebView 还...

    Android WebView加载网页以及本地图片缓存问题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,而无需离开应用。WebView不仅能够加载远程HTTP/HTTPS网址,还能处理本地HTML、CSS和JavaScript资源,极大地增强了应用...

    详解android 用webview加载网页(https和http)

    Android WebView 加载网页是移动应用开发中的一项基本需求。然而,在加载 HTTPS 和 HTTP 网页时,WebView 可能会出现一些问题,本文将详细介绍这两个错误的解决方法。 错误一:加载 HTTPS 请求的网页时,WebView ...

    android webview 控件学习及例子

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,实现与网页的交互。WebView不仅能够加载HTML、CSS和JavaScript,还可以通过JavaScript与Android原生代码进行通信,为混合式...

    Android开发中使用WebView控件浏览网页的方法详解

    Android WebView控件是Android开发中最常用的控件之一,它可以在移动端应用程序中显示网页内容。在Android开发中使用WebView控件浏览网页的方法有很多,本文将详细介绍Android开发中使用WebView控件浏览网页的方法,...

    android webview模拟网页post操作

    在Android开发中,WebView是一个非常重要的组件,它允许在应用程序中加载和显示网页内容,同时提供了与网页交互的能力。其中一个常见的需求就是通过WebView模拟网页的POST操作,这通常用于实现登录功能、表单提交等...

    实例详解Android Webview拦截ajax请求

    Android Webview 拦截 Ajax 请求的详细讲解 Android Webview 提供了页面加载及资源请求的钩子,但是对于 H5 的 Ajax 请求并没有提供干涉的接口。这意味着我们不能在 Webview 中干涉 JavaScript 发起的 HTTP 请求,...

Global site tag (gtag.js) - Google Analytics