我编写了一个 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);
}
发生的情况是进度只会被输出after文件已下载。如果我将 PluginResult.Status 设置为 NO_RESULT,它根本不会输出任何内容。
你正在用吗
cordova.getThreadPool().execute(new Runnable() {
public void run() {
// while loop goes here
}
});
在你的下载代码的开头?
看一下src/org/apache/cordova/FileTransfer.java https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/FileTransfer.java#L310。这些文件几乎完成了您正在做的事情,您可以看到它们如何发送实时进度更新,因为它们位于单独的线程中。
我认为问题在于 JavaScript 和 Java 代码在同一个WebCore线程中运行 http://docs.phonegap.com/en/2.5.0/guide_plugin-development_android_index.md.html#Developing%20a%20Plugin%20on%20Android所以发生的情况是下载阻塞了 Java 和 UI 之间的通信(例如,发送结果),直到下载完成。
如果您遵循该指南中关于不阻塞 WebCore 线程的建议(因此,请使用:cordova.getThreadPool().execute())
,您将能够获得进度更新。
为了测试这一点,我使用了这个插件:https://github.com/phonegap/phonegap-plugins/blob/master/Android/Downloader/Downloader.java https://github.com/phonegap/phonegap-plugins/blob/master/Android/Downloader/Downloader.java进行文件下载。就目前情况而言,此代码的行为与您的代码相同 - 仅在下载文件后发送进度更新。但是,一旦我将 downloadUrl() 方法包装在可运行文件中,它就可以正常工作,在发生进度更新时发送进度更新,而不是等到结束。
如果这有帮助或者您希望我提出更好的解释,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)