2013-03-19 12 views
6

Napisałem wtyczkę Cordova, aby pobrać plik i zapisać go w folderze danych. Wszystko działa dobrze, z wyjątkiem wartości zwracanej. Chciałbym wyświetlić pasek postępu i potrzebuję uzyskać bieżący postęp. Tutaj jest odpowiednia część mojego kodu:Wyjście opóźnione z 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); 
    } 
    } 

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

Co się dzieje, że postęp będzie tylko wyjście po plik został pobrany. Jeśli ustawię PluginResult.Status na NO_RESULT, to nic nie wyświetli.

Odpowiedz

4

używasz

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

na początku kodu pobierania?

Spójrz na src/org/apache/cordova/FileTransfer.java. Te pliki robią prawie wszystko, co robisz i możesz zobaczyć, w jaki sposób mogą wysyłać aktualizacje postępu na żywo, ponieważ znajdują się w osobnym wątku.

Myślę, że problem polega na tym, że zarówno kod JavaScript, jak i kod Java run in the same WebCore thread powodują, że pobieranie blokuje komunikację między Javą a interfejsem użytkownika (np. Wysyłanie wyniku) do momentu zakończenia pobierania.

Jeśli zastosujemy się do rad zawartych w tym przewodniku o nie blokowanie wątku WebCore (tak, użyj. cordova.getThreadPool().execute()), będziesz w stanie uzyskać postęp aktualizacji

Aby to sprawdzić, wziąłem tej wtyczki: https://github.com/phonegap/phonegap-plugins/blob/master/Android/Downloader/Downloader.java to pobiera plik. W obecnym stanie kod zachowuje się tak samo jak twój - aktualizacja postępu jest wysyłana dopiero po pobraniu pliku. Jednak po zapakowaniu metody downloadUrl() w trybie roboczym działało dobrze, wysyłając postęp aktualizacje, gdy się wydarzyły, zamiast czekać do końca.

Proszę dać mi znać, jeśli to pomoże lub jeśli chcesz, bym wymyślił wyjaśnienie tter.

+0

Dzięki za odpowiedź. Zamiast tego skorzystałem z funkcji pobierania Phonegap, ale skierowanie mnie na cordova.getThreadPool przydało się w innych częściach aplikacji :) –

+0

Nie ma za co, cieszę się, że udało ci się coś wymyślić! – MBillau

Powiązane problemy