Phonegap和WebWorkers
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phonegap和WebWorkers相关的知识,希望对你有一定的参考价值。
我正在尝试编写PhoneGap / Cordova应用程序。
我正在尝试在Web Workers中执行一些更长时间运行的背景。但是我发现Web Workers中没有提供某些功能。
navigator.connection
可以在主脚本中找到,但是在web worker中是未定义的,navigator.geolocation
也是如此。
我也想从web worker中访问一个sql-lite数据库。
如何在PhoneGap / Cordova中进行这样的后台操作?
任何人都可以提供任何帮助都会很棒。
首先,您需要了解Worker是一个新线程或进程,这不包括窗口和文档对象。
Cordova在webview和本机API之间创建了一个接口。如果您在worker中运行,则无法访问此API接口,因此您无法使用插件或cordova核心。
我尝试将cordova.js脚本导入到worker中:
loadScript('../cordova.js');
但是当它找不到窗口对象时会抛出错误。最后,模拟对象:
self.window = this;
self.window.document = this;
loadScript('../cordova.js');
cordovas脚本抛出“ReferenceError:提示未定义”。
另一方面,您需要了解,WebView和本机代码之间的通信是异步的。例如,如果发送SQLite查询,则javascript代码将继续运行,当查询解析时,API会向WebView发送事件并运行回调。
我使用worker来加密数据,因为这个过程太难并导致阻塞。但是如果你需要使用cordova插件,你就不会遇到这个问题。
有一个解释to understand this。
对于SQLite,我建议你使用Cordova-SQLitePlugin。
如果你需要自己的高级过程,你可以学习如何制作插件:https://cordova.apache.org/docs/en/4.0.0/guide_hybrid_plugins_index.md.html
在此期间,您可以使用工作人员发送和接收数据,但不能使用资源引用。请注意,使用apis(如SQLite),这将是异步的,您不需要打开另一个进程来执行它们。您可以将结果发送给工作人员并从那里开始工作。
我想成像,你可以通过消息传递给工人。像这里建议的东西:
javascript web workers - how do I pass arguments?
对于sql-lite数据库,您应该能够在工作脚本中初始化连接库,就像使用主脚本一样。
我意识到这个答案可能不值得赏心悦目,但可能会让你开始朝着正确的方向前进
由于您的Web Workers在主应用程序线程之外运行,因此它们与主应用程序不具有相同的JavaScript功能访问权限。您的员工无权访问:
- DOM
- 文档对象
- 窗口对象
- 父对象
如果您希望UI线程中的应用程序与工作程序通信,则需要通过消息传递对象。但由于工人接受string
,你可以使用JSON.parse()
或JSON.stringify()
成功发送对象。
以上是关于Phonegap和WebWorkers的主要内容,如果未能解决你的问题,请参考以下文章