Phonegap和WebWorkers

Nea*_*aox 11 web-worker cordova phonegap-build

我正在尝试编写PhoneGap/Cordova应用程序.

我正在尝试在Web Workers中执行一些更长时间运行的背景.但是我发现Web Workers中没有提供某些功能.

navigator.connection可以从主脚本中获得,但是在Web worker中是未定义的,同样适用navigator.geolocation.

我也想从web worker中访问一个sql-lite数据库.

如何在PhoneGap/Cordova中进行这样的后台操作?

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

Exo*_*xos 18

首先,您需要了解Worker是一个新线程或进程,这不包括窗口和文档对象.

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

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

loadScript('../cordova.js');
Run Code Online (Sandbox Code Playgroud)

但是当它找不到窗口对象时会抛出错误.最后,模拟对象:

self.window = this;
self.window.document = this;
loadScript('../cordova.js');
Run Code Online (Sandbox Code Playgroud)

cordova的脚本抛出"ReferenceError:提示未定义".

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

我使用worker来加密数据,因为这个过程太难并导致阻塞.但是如果你需要使用cordova插件,你就不会遇到这个问题.

理解这一点有一个解释.

对于SQLite,我建议您使用Cordova-SQLitePlugin.

如果您需要自己的高级过程,可以了解如何制作插件:https://cordova.apache.org/docs/en/4.0.0/guide_hybrid_plugins_index.md.html

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