由于密集计算,Cordova app阻止

时间:2017-11-28 15:28:24

标签: android ios multithreading cordova web-worker

我正在编写一个Cordova应用程序,在某些时候,计算有点太重(数字签名)。因此,当单击启动这些计算的按钮时,UI会立即冻结。

计算也是javascript代码,在Cordova中是否有任何方法可以使用Web worker或等效的东西并将它们卸载到另一个线程?

1 个答案:

答案 0 :(得分:1)

您可以使用Web worker在不同的线程上执行强化JS处理,因此您不会阻止UI线程。 注意:您需要使用现代Webview,因此Crosswalk如果定位到Android 4.x(由于自我更新的Webview,Android 5+应该没问题。)

您可以这样做:

myapp.js:

var worker = new Worker('my.worker.js');

// Receive the output from the worker when it's done
worker.addEventListener('message', function (e) {
    try {
        var data = e.data;

        if(!data.success){
            handleError(data.error);
        }else{
            display(data.output);
        }        
    } catch (ex) {
        handleError(ex);
    }
}, false);

// Start the worker with some input
worker.postMessage({
    input: "something heavy to process"
});

my.worker.js:

importScripts('lib/some.dependency.js');

// Receive the input from the main UI thread
self.addEventListener('message', function(ev) {
  try{
    var data = ev.data;
    var input = data.input;

    var output = doSomeHeavyLifting(input);

    self.postMessage({
      success: true,
      output: output
    });
  }catch(ex){
    self.postMessage({
      success: false,
      error: ex
    });
  }
}, false);