2013-03-19 15 views
6

Ich habe ein Cordova-Plugin geschrieben, um eine Datei herunterzuladen und im Datenordner zu speichern. Bis auf den Rückgabewert funktioniert alles einwandfrei. Ich möchte einen Fortschrittsbalken anzeigen und brauche den aktuellen Fortschritt. Hier ist der relevante Teil von meinem Code:Ausgabe verzögert von Cordova Plugin

while ((readed = is.read(buffer)) > 0) { 
    fos.write(buffer, 0, readed); 
    totalReaded += readed; 

    int newProgress = (int) (totalReaded*100/fileSize); 
    if (newProgress != progress) { 
     progress = newProgress; 
     PluginResult res = new PluginResult(PluginResult.Status.OK, progress); 
     res.setKeepCallback(true); 
     callbackContext.sendPluginResult(res); 
    } 
    } 

Mein JavaScript:

downloader.prototype.writeFile = function (downloaderSuccess, downloaderFailure, options) { 
    cordova.exec(downloaderSuccess, downloaderFailure, "downloader", "writeFile", options); 
}; 

function downloaderSuccess(progress) { 
    WL.Logger.debug("Result: "+progress) 
} 

function downloaderFailure(error) { 
    WL.Logger.error("Error: "+error); 
} 

Was passiert, ist, dass der Fortschritt nur ausgegeben wird nach die Datei heruntergeladen wurde. Wenn ich den PluginResult.Status auf NO_RESULT setze, wird nichts ausgegeben.

Antwort

4

verwenden Sie

cordova.getThreadPool().execute(new Runnable() { 
      public void run() { 
       // while loop goes here 
      } 
     }); 

im Start des Download-Code?

Werfen Sie einen Blick auf src/org/apache/cordova/FileTransfer.java. Diese Dateien machen ziemlich genau das, was Sie tun, und Sie können sehen, wie sie Live-Fortschritts-Updates senden können, weil sie sich in einem separaten Thread befinden.

Ich denke das Problem ist, dass sowohl der JavaScript- als auch der Java-Code run in the same WebCore thread so ist, was passiert ist, dass der Download die Kommunikation zwischen Java und der UI blockiert (zB das Ergebnis sendet), bis der Download abgeschlossen ist.

Wenn Sie die Ratschläge in diesem Leitfaden über nicht blockiert den WebCore Gewinde (so folgen, benutzen. cordova.getThreadPool().execute()), werden Sie in der Lage sein, um Updates zu erhalten Fortschritt

Um dies zu testen, nahm ich dieses Plugin: https://github.com/phonegap/phonegap-plugins/blob/master/Android/Downloader/Downloader.java Das funktioniert so, wie es bei Ihnen der Fall ist - das Fortschritts-Update wird erst nach dem Herunterladen der Datei gesendet, aber sobald ich die downloadUrl() -Methode in das runnable-Format eingeschlossen habe, funktionierte es einwandfrei und der Fortschritt wurde gesendet Updates, wie sie passiert sind, anstatt bis zum Ende zu warten.

Bitte lassen Sie mich wissen, wenn dies hilft oder wenn Sie möchten, dass ich mit einem zu kommen Tter Erklärung.

+0

Danke für Ihre Antwort. Am Ende habe ich die Phonegap-Download-Funktionen verwendet, aber das Zeigen auf den cordova.getThreadPool war nützlich für andere Teile der App :) –

+0

Gern geschehen, froh, dass Sie etwas herausgefunden haben! – MBillau