2013-03-19 16 views
6

ファイルをダウンロードしてデータフォルダに保存するためにCordovaプラグインを作成しました。戻り値以外はすべて正常に動作しています。プログレスバーを表示して現在の進捗状況を取得する必要があります。ここに私のコードから関連する部分があります:Cordovaプラグインからの出力が遅い

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

私は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); 
} 

何が起こるかというと進歩が唯一のファイルがダウンロードされた後に出力になるということです。 PluginResult.StatusをNO_RESULTに設定すると、何も出力されません。

答えて

4

あなたのダウンロードコードの開始に

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

を使用していますか?

src/org/apache/cordova/FileTransfer.javaをご覧ください。このファイルは、あなたがやっていることとほとんど同じです。別のスレッドに入っているので、進行状況の更新をどのように送信できるのか分かります。

私はJavaScriptとJavaコードの両方がrun in the same WebCore threadだと思います。ダウンロードが完了するまで、ダウンロードはJavaとUI間の通信をブロックしています(結果を送信するなど)。

あなたはWebCoreのスレッドをブロックしていない程度というガイドのアドバイスに従うならば(そう、使用:。これをテストするにcordova.getThreadPool().execute())、あなたは進行状況の更新を取得することができます

は、私はこのプラグインを取った:https://github.com/phonegap/phonegap-plugins/blob/master/Android/Downloader/Downloader.java このコードはあなたのものと同じように動作します - ファイルがダウンロードされた後でのみ進行状況の更新が送信されますが、実行可能ファイルにdownloadUrl()メソッドをラップすると、

私がこれを助けるかどうか、またはあなたが私を思いついてくれるかどうか教えてください説明をする。

+0

あなたの答えをありがとう。代わりにPhonegapのダウンロード機能を使用して終了しましたが、cordova.getThreadPoolを私に指摘すると、アプリの他の部分に便利でした:) –

+0

何かを見つけられたことを嬉しく思います! – MBillau

関連する問題