Android开发教程之使用 Web Workers 来加速您的移动 Web 应用程序.ppt_第1页
Android开发教程之使用 Web Workers 来加速您的移动 Web 应用程序.ppt_第2页
Android开发教程之使用 Web Workers 来加速您的移动 Web 应用程序.ppt_第3页
Android开发教程之使用 Web Workers 来加速您的移动 Web 应用程序.ppt_第4页
Android开发教程之使用 Web Workers 来加速您的移动 Web 应用程序.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android开发教程之使用WebWorkers来加速您的移动Web应用程序 简介关于本系列开始移动设备上的多线程JavaScript清单1 在页面脚本中使用一个WebWorker清单2 一个Worker脚本设备支持使用Workers改善性能清单3 交易应用程序HTML清单4 loadDeals函数清单5 预取交易细节清单6 交易细节Worker脚本清单7 Worker导入的脚本清单8 showDetails函数结束语 一直以来 Web应用程序被局限在一个单线程世界中 这的确限制了开发人员在他们的代码中的作为 因为任何太复杂的东西都存在冻结应用程序UI的风险 通过将多线程引入Web应用程序 WebWorkers扭转了这一不利局面 这对于大部分应用程序逻辑都位于客户端的移动Web应用程序来说尤其有用 在本文中 您将了解如何使用WebWorkers并发现哪些任务最适合它们 您还将看到如何使用其他HTML5技术才能提高使用那些技术的效率 简介 HTML5是一项被大肆宣扬的技术 但是它实至名归 它有望成为一个技术引爆点 将桌面应用程序功能引向浏览器 它不仅适用于传统浏览器 甚至也针对移动浏览器 更好的是 最流行的移动浏览器已经采纳和实现HTML5规范的很多重要部分 在这个五部分的系列中 我们将详细了解几个新技术 它们都是HTML5的一部分 可以大大影响移动Web应用程序开发 在每一部分中 都将开发一个可以工作的移动Web应用程序 展示一个可以用于现代移动Web浏览器 比如iPhone和基于Android的设备上的浏览器 的HTML5特性 Android开发教程之关于本系列 在本文中 您将使用最新的Web技术开发Web应用程序 这里的大部分代码只是HTML JavaScript和CSS 所有Web开发人员的核心技术 所需的最重要的工具是用于进行测试的浏览器 本文大部分代码将在最新桌面浏览器上运行 但也有一些例外 我们将在文章中进行说明 当然 您也必须在移动浏览器上测试 为此 您需要最新的iPhone和AndroidSDKs 本文将使用iPhoneSDK3 1 3和AndroidSDK2 1 本文的样例还将使用一个代理服务器来从浏览器访问远程服务 这个代理服务器是一个简单的Java servlet 但也可以使用以PHP Ruby以及其他语言编写的代理轻松替换 参见参考资料获取链接 Android开发教程之开始 对于大多数开发人员来说 多线程或并发编程并不新鲜 但是 JavaScript并不是一种支持并发编程的语言 JavaScript的创建者认为 对于JavaScript这样旨在Web页面上执行简单任务的语言来说 并发编程容易出现问题 而且没有必要 然而 由于Web页面已经发展成为Web应用程序 使用JavaScript完成的任务的复杂程度已经大大增加 向JavaScript提出了与其他语言同等的要求 与此同时 使用其他支持并发编程的语言工作的开发人员经常面临伴随线程和mutexes这样的并发原语而来的超高复杂性的困扰 实际上 最近像Scala Clojure和F 这样的几种新语言已经发展 它们都有可能简化并发性 移动设备上的多线程JavaScript 常用缩略词Ajax 异步JavaScript XMLAPI 应用程序编程接口CSS 层叠样式表DOM 文档对象模型HTML 超文本标记语言REST 具象状态传输SDK 软件开发工具包UI 用户界面URL 统一资源定位符W3C 万维网联盟XML 可扩展标记语言 Android开发教程 WebWorker规范不只是向JavaScript和Web浏览器添加并发性 而且是以一种智慧的方式添加 这种方式将增加开发人员的能力 但不会向他们提供一种会导致问题的工具 例如 多年来 桌面应用程序开发人员一直在使用多线程来支持他们的应用程序访问多个I O资源 以避免在等待这些资源时冻结UI 然而 当这些多线程更改共享的资源 包括UI 时 这样的应用程序通常会出现问题 因为这种行为可能会导致应用程序冻结或崩溃 有了WebWorkers 这种情况就不会发生 衍生线程不能访问主UI线程访问的资源 事实上 衍生线程中的代码甚至不能与主UI线程执行的代码位于同一个文件中 您甚至必须提供相应的外部文件作为构造函数的一部分 如清单1所示 这个进程使用三个资源 在主线程上执行的Web页面JavaScript 我称其为页面脚本 Worker对象 这是用于执行WebWorker函数的JavaScript对象 将在新衍生的线程上执行的脚本 我称其为Worker脚本 让我们首先看看清单1中的页面脚本 Android开发教程 varworker newWorker worker js worker onmessage function message dostuff worker postMessage someDataToDoStuffWith 在清单1中 您可以看到使用WebWorkers的三个基本步骤 首先 您创建一个Worker对象并向它传递将在新线程中执行的脚本的URL Worker将执行的所有代码都必须包含在一个Worker脚本中 该脚本的URL将被传递到这个Worker的构造函数中 这个Worker脚本的URL受到浏览器的同源策略的限制 它必须来自加载这个页面的同一个域 该页面已加载正在创建这个WebWorker的页面脚本 清单1 在页面脚本中使用一个WebWorker 下一步是使用onmessage函数指定一个回调处理器函数 这个回调函数将在该Worker脚本执行后调用 message是从该Worker脚本返回的数据 您可以随意处理该消息 回调函数在主线程上执行 因此它能访问DOM Worker脚本在一个不同的线程内运行且不能访问DOM 因此 您需要将来自这个Worker脚本的数据返回主线程 在那里 您可以安全地修改DOM来更新您的应用程序的UI 这是WebWorkers的无共享设计的关键特性 清单1中的最后一行展示如何通过调用Worker的postMessage函数来启动它 这里 您传递一条消息 重申一下 它只是数据 给Worker 当然 postMessage是一个异步函数 您调用它 它就立即返回 现在 检查这个Worker脚本 清单2中的代码是来自清单1的worker js文件的内容 Android开发教程 importScripts utils js varworkerState onmessage function message workerState message data dostuffwiththemessagepostMessage responseXml this responseText Android开发教程之清单2 一个Worker脚本 可以看到 这个Worker脚本拥有自己的onmessage函数 该函数在您从主线程调用postMessage时调用 从页面脚本传来的数据被传递到message对象中的postMessage函数 您通过检索message对象的data属性来访问该数据 当您处理完Worker脚本中的数据时 调用postMessage函数将数据返回主线程 主线程也可以通过访问它接收到的消息的data属性来访问该数据 至此 您已经见识了WebWorkers的这个简单 但强大的语义 接下来 您将了解如何应用这个语义来加速移动Web应用程序 在此之前 有必要先讨论一下设备支持 毕竟 这些是移动Web应用程序 且处理不同浏览器之间的功能的区别对于移动Web应用程序开发很重要 Android开发教程 从Android2 0开始 Android浏览器就拥有了对HTML5WebWorker规范的全面支持 在撰写本文之时 最新的Android设备 包括非常流行的MotorolaDroid 已配置了Android2 1 另外 此特性在运行Maemo操作系统的Nokia设备上的MozillaFennec浏览器以及WindowsMobile设备上受到完全支持 这里需要引起注意的遗漏是iPhone iPhoneOS3 1 3和3 2版 在iPad上运行的OS的版本 并不支持WebWorkers 但是 此特性已在Safari上受到支持 因此 此特性在运行在iPhone上的MobileSafari浏览器上出现应该只是一个时间问题 鉴于iPhone的主导地位 尤其是在美国 最好不要依赖WebWorkers的存在 且不要只在您检测到它们的存在时才使用它们来增强您的移动Web应用程序 意识到这一点后 我们来看看如何使用WebWorkers来加速您的移动Web应用程序 Android开发教程之设备支持 智能手机浏览器上的WebWorker支持很不错 而且一直在不断改进 这就提出了一个问题 什么时候需要在移动Web应用程序中使用Workers 答案很简单 需要完成耗时的任务的任何时候 有些示例展示了如何将Workers用于执行密集的数学计算 比如计算1万位数的圆周率 很可能您永远也不需要在Web应用程序上执行这样一个计算 在移动Web应用程序上执行这种计算的几率则更小 但是 从远程资源检索数据则相当常见 这也是本文示例的关注点 在这个示例中 您将从eBay检索一个DailyDeals 每天都在变化的交易 列表 这个交易列表包含关于每笔交易的简短信息 更详细的信息可以通过使用eBay的ShoppingAPI获取 当用户浏览这个交易列表选择感兴趣的商品时 您将使用WebWorkers来预取这个附加信息 要从您的Web应用程序访问所有这些eBay数据 您需要通过使用一个泛型代理 genericproxy 来处理浏览器的同源策略 一个简单的Javaservlet将用于这个代理 它包含在本文的代码中 但不在这里单独展示 相反 我们将把注意力集中在处理WebWorkers的代码上 清单3展示了这个交易应用程序的基本HTML页面 Android开发教程之使用Workers改善性能 WorkerDealsDealsMoreDeals Android开发教程之清单3 交易应用程序HTML 可以看出 这是一段非常简单的HTML 它只是一个shell 您使用JavaScript检索数据并生成UI 这是移动Web应用程序的优化设计 因为它允许将所有代码和静态标记缓存到设备上 用户只需等待来自服务器的数据 注意 在清单3中 一旦那个body加载 您就调用loadDeals函数 在那里 您将加载清单4中的应用程序的初始数据 Android开发教程 vardeals varsections vardealDetails vardealsUrl Android开发教程之清单4 loadDeals函数 for i 0 i dealsXml childNodes length i childNode dealsXml childNodes item i switch childNode localName case Item deals push parseDeal childNode break case MoreDeals for j 0 j childNode childNodes length j varsectionXml childNode childNodes item j if sectionXml Android开发教程 deals forEach function deal varentry createDealUi deal deals appendChild entry loadDetails deals sections forEach function section varui createSectionUi section moreDeals appendChild ui loadDetails section deals xhr open GET proxy url escape dealsUrl xhr send null Android开发教程 清单4展示了loadDeals函数 以及应用程序中使用的全局变量 您使用了一个deals数组和一个sections数组 它们是相关交易的附加组 例如 Dealsunder 10 还有一个名为dealDetails的映射 其键是ItemIDs 来自于交易数据 其值是从eBayShoppingAPI获取的详细信息 您首先调用一个代理 该代理又将调用eBayDailyDealsRESTAPI 这将把交易列表作为一个XML文档提供给您 您解析用于进行Ajax调用的XMLHttpRequest对象的onreadystatechange函数中的文档 您还使用其他两个函数 parseDeal和parseSection 来将XML节点解析为更易于使用的JavaScript对象 这些函数可以在可下载的代码样例 参见下载部分 中找到 但由于它们只是令人厌烦的XML解析函数 因此我在这里没有包括它们 最后 在解析了XML后 您还使用了另外两个函数 createDealUi和createSectionUi 来修改DOM 此时 这个UI如图1所示 Android开发教程 图1 MobileDealsUI Android开发教程 如果您返回清单4 就会注意到在加载主交易之后 您对这些交易的每个部分都调用了loadDetails函数 在这个函数中 您通过使用eBayShoppingAPI加载每个交易的附加细节 但前提是浏览器支持WebWorkers 清单5展示了loadDetails函数 Android开发教程 functionloadDetails items if window Worker items forEach function item varxmlStr null if window localStorage xmlStr localStorage getItem item itemId if xmlStr varitemDetails parseFromXml xmlStr dealDetails itemDetails id itemDetails else varworker newWorker details js 清单5 预取交易细节 worker onmessage function message varresponseXmlStr message data responseXml varitemDetails parseFromXml responseXmlStr if window localStorage localStorage setItem itemDetails id responseXmlStr dealDetails itemDetails id itemDetails worker postMessage item itemId Android开发教程 在loadDetails中 您首先检查全局作用域 window对象 中的Worker函数 如果该函数不在那里 那么无需做任何事 反之 您首先检查XML的localStorage以获取这个交易的细节 这是移动Web应用程序常用的本地缓存策略 本系列第2部分 参见参考资料部分的链接 详细介绍过这种策略 如果XML位于本地 那么您在parseFromXml函数中解析它并将交易细节添加到dealDetails对象 反之 则衍生一个WebWorker并使用postMessage向其发送ItemID 当这个Worker检索到数据并将数据发布回主线程后 您解析XML 将结果添加到dealDetails 然后将XML存储到localStorage中 清单6展示了这个Worker脚本 details js Android开发教程 importScripts common js onmessage function message varitemId message data varxhr newXMLHttpRequest xhr onreadystatechange function if this readyState 4 清单6 交易细节Worker脚本 这个Worker脚本非常简单 您使用Ajax调用代理 该代理又调用eBayShoppingAPI 当您收到来自代理的XML后 使用一个JavaScript对象文字 objectliteral 将其发送回主线程 注意 即使您能够使用来自一个Worker的XMLHttpRequest 但所有信息都将返回它的responseText属性 而不是它的responseXml属性 这是因为这个Worker脚本范围内没有JavaScriptDOM解析器 注意 generateUrl函数来自common js文件 见清单7 您使用importScripts函数导入common js文件 Android开发教程 functiongenerateUrl itemId varappId YOURAPPIDGOESHERE return Android开发教程之清单7 Worker导入的脚本 现在 您已经知道如何 为支持WebWorkers的浏览器 填充交易细节 我们返回图1研究一下如何在应用程序中使用这种方法 注意 每笔交易旁边都有一个ShowDetails按钮 单击该按钮修改这个UI 如图2所示 图2 显示的交易细节这个UI将在您调用showDetails函数时显示 清单8展示了这个函数 Android开发教程 functionshowDetails id varel id if el style display block el style display none e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论