Phonegap 和 WebWorkers

Posted

技术标签:

【中文标题】Phonegap 和 WebWorkers【英文标题】:Phonegap and WebWorkers 【发布时间】:2015-02-21 05:40:32 【问题描述】:

我正在尝试编写一个 PhoneGap/Cordova 应用程序。

我正在尝试在 Web Workers 中做一些更长时间运行的后台工作。但是我发现某些功能在 Web Workers 中不可用。

navigator.connection 在主脚本中可用,但在 web worker 中未定义,navigator.geolocation 也是如此。

我也想从 web worker 中访问 sql-lite 数据库。

关于如何在 PhoneGap/Cordova 中进行此类后台操作的任何想法?

任何人都可以提供的任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

首先需要了解Worker是一个新的线程或进程,不包括window和document对象。

Cordova 在 webview 和本机 API 之间创建一个接口。如果在 worker 中运行,则无法访问此 API 接口,因此无法使用插件或 cordova 核心。

我尝试将 cordova.js 脚本导入到 worker 中:

loadScript('../cordova.js');

但是当它没有找到 window 对象时会抛出错误。最后,模拟对象:

self.window = this;
self.window.document = this;
loadScript('../cordova.js');

cordova 的脚本抛出“ReferenceError: promp is not defined”。

另一方面,您需要了解,WebView 和本机代码之间的通信是异步的。例如,如果您发送 SQLite 查询,您的 javascript 代码将继续运行,当查询被解析时,API 会向 WebView 发送一个事件并运行您的回调。

例如,我使用工人来加密数据,因为这个过程太难并且会导致阻塞。但是如果你需要使用cordova插件,就不会有这个问题了。

有解释to understand this。

对于 SQLite,我建议你使用Cordova-SQLitePlugin。

如果你需要自己的hight-process,你可以学习如何制作插件:https://cordova.apache.org/docs/en/4.0.0/guide_hybrid_plugins_index.md.html

与此同时,您可以使用工作人员并发送和接收数据,但不能使用资源引用。请注意,使用 api(如 SQLite),这将是异步的,您无需打开另一个进程来执行它们。您可以将结果发送给工作人员并从那里开始工作。

【讨论】:

感谢您提供经过深思熟虑的参考答案。你的英语还不错..特别是考虑到我们对特定主题使用复杂的术语。赏金是你的!【参考方案2】:

我想你可以通过消息将这些传递给工人。像这里建议的东西:

javascript web workers - how do I pass arguments?

对于 sql-lite db,您应该能够从工作脚本中初始化连接库,就像您的主脚本一样。

我意识到这个答案可能不值得赏金,但可能会让你朝着正确的方向开始

【讨论】:

嗨,感谢您的建议,这对我需要的目的不起作用,因为这将传递当前状态的值。如果将 navigator.connection 传递给 WebWorker,则当它在主线程中更改时,它不会在 worker 中更改。我还没有尝试使用 SQLlite 对象,但我怀疑传递它也会有问题,我会试一试并回复你。再次感谢您的建议。 @Neaox "如果将 navigator.connection 传递给 WebWorker,则当它在主线程中发生变化时,它不会在工作线程中发生变化" 这是真的:在工作线程和工作线程之间没有任何共享对象 AFAIK主线程。一切都必须通过明确的消息来传达。【参考方案3】:

由于您的 Web Worker 在主应用程序线程之外运行,因此它们对 JavaScript 功能的访问权限与您的主应用程序不同。您的员工无权访问:

DOM 文档对象 窗口对象 父对象

如果您希望 UI 线程中的应用程序与工作人员通信,您需要通过消息传递对象。但是由于worker接受string,你可以使用JSON.parse()或者JSON.stringify()来成功发送对象。

【讨论】:

以上是关于Phonegap 和 WebWorkers的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap 跨域 ajax 与 PhoneGap 开发者应用程序和 cli

Phonegap Developer App 和 Phonegap Build 有不同的行为

Cordova (PhoneGap) 和 iFrame

phoneGap 4.2.0 和 Xcode 6.1.1 相机和相册错误

CORS 和 phonegap 应用程序

Phonegap录音和播放同时进行