2017-11-28 25 views
2

私はちょっと重すぎる計算(デジタル署名)がある時点でCordovaアプリを書いています。結果として、それらの計算を起動するボタンがクリックされると、UIが瞬時にフリーズします。集中的な計算のためにコルドバのアプリがブロックされています

計算はまたjavascriptコードです。Webワーカーなどを使用して別のスレッドにオフロードする方法はありますか?

+0

重計算はjsファイルまたはネイティブコードで行われています? – LuckyStarr

+0

これはjavascriptで行われました –

答えて

1

ウェブワーカーを使用して、別のスレッドでintensve JS処理を行うことができるため、UIスレッドをブロックしないでください。 注:最新のWebviewを使用する必要があるので、Android 4.xをターゲットにしている場合はCrosswalk(Android 5+は自動更新されたWebviewのためうまくいくはずです)。

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); 
+0

動作するかテストします。しかし、Cordovaアプリの中でWebワーカーを使用できると確信していますか?私は主題に関する多くの情報を見つけられませんでしたが、Webワーカーが実装されていない/禁じられているように見えました。 –

+0

'あなたはコルドバのアプリの中でウェブワーカーを使えると確信していますか?ポジティブ:AndroidとiOSの両方について、いくつかのハイプロファイルプロダクションアプリでこのテクニックを使用します。 Crosswalk/WKWebViewでうまく動作します:〜100kユーザーのユーザーベースを組み合わせると、作業者からのクラッシュはほとんどありません。 「Webワーカーが実装されていない、または禁止されているように見えます」 - これは、あなたのCordovaアプリケーションが内部で実行しているWebviewに至り、最新のWebviewはWebワーカーをサポートしています。それを試してみてください... – DaveAlden

+0

ありがとう、それは知っておくと良いです –

関連する問題