我的PhoneGap应用中存在问题。我想写一个15 MB的文件。如果我尝试操作系统会吸引越来越多的内存,应用程序会在没有消息的情况下崩溃。我可以在Android和黑莓平板电脑上重现这一点。有没有办法更有效地实现写作?
最好的问候
fe.createWriter(
(fw: any) => {
fw.onwriteend = (e) => {
fw.onwriteend = (e) => {
callback();
}
fw.write(data);
}
// write BOM (dead for now)
fw.write("");
},
(error: any) => {
alert("FileWriter Failed: " + error.code);
});
这是TypeScript,我希望JS开发人员不会为此而烦恼;)
答案 0 :(得分:18)
我找到了答案。
崩溃原因: 我认为PhoneGap FileWrite.write无法处理太大的缓冲区,也不知道确切的大小 这个问题是由于PG通过URL Scheme将数据传输到iOS,不知何故它崩溃了 “URL”太长了。
如何修复它:每次都写小块,代码如下:
function gotFileWriter(writer) {
function writeFinish() {
// ... your done code here...
}
var written = 0;
var BLOCK_SIZE = 1*1024*1024; // write 1M every time of write
function writeNext(cbFinish) {
var sz = Math.min(BLOCK_SIZE, data.byteLength - written);
var sub = data.slice(written, written+sz);
writer.write(sub);
written += sz;
writer.onwrite = function(evt) {
if (written < data.byteLength)
writeNext(cbFinish);
else
cbFinish();
};
}
writeNext(writeFinish);
}
更新2014年8月12日:
在我的实践中,通过Cordova FileSystem保存文件的性能不佳,特别是对于手机上的大文件(> 5M),需要几秒钟。如果您要将文件从服务器下载到本地磁盘,您可能需要“高效且直接”的方式,请尝试使用cordova-plugin-file-transfer插件。
答案 1 :(得分:5)
@ Imskull的回答是正确的...我只想把它放在一个Blob(确保它是blob而不是arraybuffer),这是基于顶部的那个更新...什么我还添加了一行,以确保我自己添加到文件的末尾...这足以使你的应用程序停止崩溃(主要是在i上的P)
function gotFileWriter(writer) {
function writeFinish() {
// ... your done code here...
}
var written = 0;
var BLOCK_SIZE = 1*1024*1024; // write 1M every time of write
function writeNext(cbFinish) {
writer.onwrite = function(evt) {
if (written < data.size)
writeNext(cbFinish);
else
cbFinish();
};
if (written) writer.seek(writer.length);
writer.write(data.slice(written, written + Math.min(BLOCK_SIZE, data.size - written)));
written += Math.min(BLOCK_SIZE, data.size - written);
}
writeNext(writeFinish);
}