输出延迟了Cordova插件

时间:2013-03-19 17:04:42

标签: android cordova ibm-mobilefirst

我写了一个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,它将不会输出任何内容。

1 个答案:

答案 0 :(得分: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()方法包装在runnable中,它工作正常,发送进度更新,而不是等到结束。

请告诉我这是否有帮助,或者您是否希望我提出更好的解释。