2017-11-28 8 views
2

Ich schreibe eine Cordova App, wo es irgendwann Berechnungen gibt, die etwas zu schwer sind (digitale Signaturen). Wenn die Schaltfläche zum Starten dieser Berechnungen angeklickt wird, bleibt die Benutzeroberfläche für einen Moment stehen.Cordova App blockiert wegen intensiver Berechnung

Die Berechnungen sind auch JavaScript-Code, gibt es in Cordova eine Möglichkeit, einen Web-Arbeiter oder etwas Ähnliches zu verwenden und sie in einen anderen Thread zu entladen?

+0

Die schwere Berechnung mit js oder mit dem nativen Code erfolgt ? – LuckyStarr

+0

Es ist in Javascript getan –

Antwort

1

Sie können einen Web-Worker verwenden, um die JS-Verarbeitung für einen anderen Thread zu intensivieren, damit Sie den UI-Thread nicht blockieren. Hinweis: Sie müssen ein modernes Webview, also Crosswalk verwenden, wenn Android 4.x (Android 5+ soll aufgrund der selbst aktualisierten Webview in Ordnung sein).

Sie können etwas tun:

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

Ich werde testen, ob es funktioniert. Aber sind Sie sicher, dass Sie Web-Arbeiter in einer Cordova App verwenden können? Ich habe nicht viele Informationen zu diesem Thema gefunden, aber es sah so aus, als wären Web-Mitarbeiter nicht implementiert/verboten. –

+0

'bist du sicher, dass man Webarbeiter in einer Cordova App benutzen kann'. Positiv: Ich verwende diese Technik in mehreren hochkarätigen Produktions-Apps, sowohl für Android als auch für iOS. Funktioniert gut mit Crosswalk/WKWebView: Aus einer kombinierten Benutzerbasis von ~ 100k Benutzern, sehe ich fast keine Abstürze von den Arbeitern. "Es sieht so aus, als wären Web-Mitarbeiter nicht implementiert/verboten" - das alles kommt auf das Webview, in dem Ihre Cordova-App läuft, und moderne Web-Views unterstützen Web-Mitarbeiter. Versuchen Sie es ... – DaveAlden

+0

Danke, es ist gut zu wissen –