2015-02-21 5 views
9

Ich versuche eine PhoneGap/Cordova App zu schreiben.Phonegap und WebWorker

Ich versuche, einige der länger laufenden Hintergrund Sachen in Web Workers zu tun. Ich stelle jedoch fest, dass einige der Funktionen nicht im Web Workers verfügbar sind.

navigator.connection ist innerhalb des Hauptskriptes verfügbar, aber innerhalb des Web Worker nicht definiert, dasselbe gilt für navigator.geolocation.

Ich möchte auch auf eine SQL-lite-Datenbank von innerhalb eines Web-Worker zugreifen.

Irgendwelche Ideen, wie Hintergrundoperationen wie diese aus PhoneGap/Cordova zu tun?

Jede Hilfe, die jemand geben kann, wäre großartig.

Antwort

15

Zuerst müssen Sie verstehen, erhalten begonnen, dass die Arbeiter einen neuen Thread oder Prozess ist, und das beinhaltet nicht das Fenster und Dokument Objekte.

Cordova erstellt eine Schnittstelle zwischen der Webansicht und der nativen API. Wenn Sie einen Worker ausführen, haben Sie keinen Zugriff auf diese API-Schnittstelle, daher können Sie keine Plugins oder den Cordova-Core verwenden.

Ich versuchte, das cordova.js Skript in einem Arbeiter zu importieren:

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

Aber es wirft einen Fehler, wenn sie nicht das Fenster Objekt findet. Schließlich emuliert die Objekte:

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

Die Cordovas Skript wirft „Reference: promp ist nicht definiert“.

Auf der anderen Seite müssen Sie verstehen, dass die Kommunikation zwischen dem WebView und dem systemeigenen Code asynchron sind. Wenn Sie beispielsweise eine SQLite-Abfrage senden, führt Ihr JavaScript-Code fortlaufende Läufe aus. Wenn die Abfrage aufgelöst wird, sendet die API ein Ereignis an das WebView, und Sie führen Ihren Rückruf aus.

Ich benutze Arbeiter zum Beispiel zum Verschlüsseln von Daten, weil dieser Prozess zu hart ist und zu Blockierungen führt. Aber wenn Sie Cordova Plugins verwenden müssen, haben Sie dieses Problem nicht.

Es gibt eine Erklärung to understand this.

Für SQLite empfehle ich Ihnen Cordova-SQLitePlugin zu verwenden.

Wenn Sie Ihren eigenen höhen Prozess benötigen, können Sie lernen, wie Plugins zu machen: https://cordova.apache.org/docs/en/4.0.0/guide_hybrid_plugins_index.md.html

In der Zwischenzeit können Sie Arbeiter verwenden und senden und empfangen Daten, aber nicht mit Ressourcen Referenzen. Beachten Sie, dass dies mit apis (wie SQLite) asynchron erfolgt und Sie keinen weiteren Prozess zur Ausführung öffnen müssen. Sie können das Ergebnis einfach an einen Mitarbeiter senden und von dort aus bearbeiten.

+0

Vielen Dank für eine gut durchdachte Antwort mit Referenzen. Ihr Englisch ist nicht so schlecht ... vor allem, wenn wir komplexe Begriffe für ein bestimmtes Thema verwenden. Das Kopfgeld gehört dir! – Neaox

1

Ich würde imaging, dass Sie diese an den Arbeiter mit Nachricht übergeben können. So etwas wie hier vorgeschlagen:

javascript web workers - how do I pass arguments?

Wie für die SQL-lite db Sie in der Lage sein sollte, eine Verbindung lib innerhalb eines Arbeitnehmers Skript viel die gleiche Art und Weise Sie Ihre Haupt-Skript würde zu initialisieren.

Ich weiß, diese Antwort nicht Huld würdig sein kann, aber können Sie in die richtige Richtung

+0

Hallo, danke für den Vorschlag, das wird nicht für den Zweck, den ich brauche, da dies die Werte in ihrem aktuellen Zustand übergeben wird. Bei Übergabe an den WebWorker ändert sich die navigator.connection innerhalb des Worker nicht, wenn sie sich im Hauptthread ändert. Ich habe es nicht mit dem SQLlite-Objekt versucht, aber ich vermute, dass es Probleme geben wird, dies auch zu passieren, ich werde es versuchen und zu Ihnen zurückkommen. Nochmals vielen Dank für den Vorschlag. – Neaox

+0

@Neaox "Wenn die navigator.connection an den WebWorker übergeben wird, ändert sie sich nicht im Worker, wenn sie im Hauptthread geändert wird" Das ist wahr: Es gibt keine gemeinsamen Objekte AFAIK zwischen dem Worker und dem Hauptthread. Alles muss durch explizite Nachrichten kommuniziert werden. –

1

Aufgrund der Tatsache, dass Ihre Web Workers außerhalb des Hauptanwendungs-Threads ausgeführt werden, haben sie nicht denselben Zugriff auf JavaScript-Funktionen wie Ihre Hauptanwendung. Ihre Mitarbeiter haben keinen Zugriff auf:

  • Das DOM
  • Das Dokument-Objekt
  • Das Fenster Objekt
  • Das übergeordnete Objekt

Wenn Sie Ihre Anwendung in dem UI-Thread wollen kommunizieren Sie mit einem Arbeiter, den Sie das Objekt durch die Nachricht übergeben müssen. Aber da der Arbeiter string akzeptiert, können Sie JSON.parse() oder JSON.stringify() verwenden, um das Objekt erfolgreich zu senden.