2013-03-19 13 views
6

Ho scritto un plug-in Cordova per scaricare un file e salvarlo nella cartella dei dati. Tutto funziona bene tranne il valore restituito. Vorrei visualizzare una barra di avanzamento e ho bisogno di ottenere i progressi attuali. Ecco la parte rilevante dal mio codice:Uscita ritardata da 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); 
    } 
    } 

mio 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); 
} 

Quello che succede è che il progresso sarà emesso solo dopo il file è stato scaricato. Se imposto il PluginResult.Status su NO_RESULT, non produrrà nulla.

risposta

4

stai usando

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

nella inizio del codice per il download?

Dai un'occhiata allo src/org/apache/cordova/FileTransfer.java. Questo file fa più o meno quello che stai facendo e puoi vedere come sono in grado di inviare aggiornamenti in tempo reale perché si trovano in un thread separato.

Penso che il problema sia che sia il codice Java run in the same WebCore thread sia quello che sta accadendo è che il download sta bloccando la comunicazione tra Java e l'interfaccia utente (ad esempio, l'invio del risultato) fino al download.

Se si seguono i consigli in quanto guida di non bloccare il thread WebCore (quindi, utilizzare:. cordova.getThreadPool().execute()), sarete in grado di ottenere gli aggiornamenti progredire

Per verificare ciò, ho preso questo plugin: https://github.com/phonegap/phonegap-plugins/blob/master/Android/Downloader/Downloader.java Il download di file funziona come il tuo: l'aggiornamento di avanzamento viene inviato solo dopo il download del file, tuttavia, una volta completato il metodo downloadUrl() nel runnable, ha funzionato correttamente, inviando i progressi aggiornamenti come sono accaduti invece di aspettare fino alla fine

Per favore fatemi sapere se questo aiuta o se volete farmi venire un be spiegazione

+0

Grazie per la risposta. Ho finito per utilizzare invece le funzioni di download di PhoneGap, ma indicarmi il cordova.getThreadPool era utile per altre parti dell'app :) –

+0

Sei il benvenuto, felice che tu sia riuscito a capire qualcosa! – MBillau