14

PhoneGap アプリに問題があります。15MBのファイルを書きたいです。試してみると、OS はますます多くのメモリをプルし、アプリはメッセージなしでクラッシュします。これは、Android および Blackberry タブレットで再現できます。ライティングをより効率的に実装する方法はありますか?

よろしくお願いします

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 開発者がこれに苦労しないことを願っています ;)

4

2 に答える 2

22

私は答えを見つけました。

クラッシュの理由: PhoneGap FileWrite.write は大きすぎるバッファーを処理できません。正確なサイズがわかりません。この問題は、PG が URL スキームを介して 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プラグインを試してください。

于 2013-12-12T08:38:52.870 に答える
8

@Imskullの答えは正しいものです...私はBlob用のものを入れたいだけです(配列バッファではなくblobであることを確認してください)。これは上のものに基づいて更新されます...私も追加したのは行でしたファイルの最後に追加していることを確認してください...アプリのクラッシュを止めるには十分すぎるほどです(主にiOSで: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);
}
于 2016-09-15T08:04:27.400 に答える