34

アプリで奇妙なエラーが発生しました。

私のアプリでは、zipFile をダウンロードし、コンテンツをそのまま読み取り、削除することもできます。それが正確に何であるかは問題ではありません。

問題: Motorola Xoom (バージョン 4.0.4) でのみ、ファイルをダウンロードして解凍し、データを読み取り、すべてを削除できます。しかし、ファイルを再度ダウンロードしようとすると、ファイルを解凍してファイルを SD カードにコピーしているときに、エラー EBUSY (デバイスまたはリソースがビジー) でクラッシュします。

  1. なぜ最初だけ機能するのですか?
  2. そのエラーはどういう意味ですか?
  3. Xoom でのみこのエラーが発生するのはなぜですか?

私はそれに対する解決策を見つけることができません。他のすべてのデバイスでは正常に動作し、エラーや問題はありません。

LogCat:

07-18 12:27:46.774: E/PrepareMagTask(10057): IOException
07-18 12:27:46.774: E/PrepareMagTask(10057): java.io.FileNotFoundException: /mnt/sdcard/Android/data/com.xxxxxx.android/files/content/23760/emag.db: open failed: EBUSY (Device or resource busy)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at libcore.io.IoBridge.open(IoBridge.java:406)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at com.xxxxx.android.util.io.ZipHelper.uncompressEntry(ZipHelper.java:35)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at com.xxxxx.android.task.PrepareMagTask.doInBackground(PrepareMagTask.java:271)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at com.xxxxx.android.task.PrepareMagTask.doInBackground(PrepareMagTask.java:1)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at java.lang.Thread.run(Thread.java:856)
07-18 12:27:46.774: E/PrepareMagTask(10057): Caused by: libcore.io.ErrnoException: open failed: EBUSY (Device or resource busy)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at libcore.io.Posix.open(Native Method)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
07-18 12:27:46.774: E/PrepareMagTask(10057):    at libcore.io.IoBridge.open(IoBridge.java:390)
07-18 12:27:46.774: E/PrepareMagTask(10057):    ... 11 more

ZipHelper クラスの 35 行目でクラッシュします。

FileHelper.copy(zipFile.getInputStream(entry), new FileOutputStream(outputFile), modify);

getInputStream(entry) ...そして私は本当に理由を知りませんか?

デバイスがビジー状態のときにデバイスまたはリソースを待機する方法はありますか? これは、ファイルを解凍しようとするたびに発生し、アプリは 5 回 (ダウンロード -> 解凍) 試行し、毎回クラッシュします。

編集: Xoom だけではないことがわかりました。バージョン 4.0.4 の Asus Transformer にもエラーがあります。

4

7 に答える 7

78

大きな答えがあります!! この問題は、Android システムまたは FAT32 システムに起因します。システムがエラーを取得する方法を説明できません。ファイルの削除と FAT32 システムに関係があります。

しかし、解決策は非常に簡単です。ディレクトリまたはファイルを削除する前に、名前を変更してください。

名前を変更するコード:

final File to = new File(file.getAbsolutePath() + System.currentTimeMillis());
file.renameTo(to);
to.delete();

つまり、削除する前にフォルダーまたはファイルの名前を変更すると、システムが既存のファイルまたは再度保存したい開いているファイル (またはこのようなもの) を再度開こうとする可能性はありません。

于 2012-08-02T11:27:05.810 に答える
6

この問題の原因として考えられるのは

  • 2 つ以上のプロセスが同じファイルを参照しています

  • ファイルは削除されましたが、参照は強制終了されません

ただし、それを削除したか、1 つの参照のみが強制終了されたか、1 つ以上のプロセスがこのファイルも参照しています

あなたは段階的にすることができます:

ファイルを削除する前に

  • adb shell lsof | grep "com.xxxxxx.android"

開いたファイルと、開いたファイルを参照しているプロセス。また、このコマンドはプロセスIDを表示します

よりも、

  • adb shell ls -al /proc/%d/fd

サプライズ待ってますO(∩_∩)O

幸運を!

于 2014-02-18T11:41:31.090 に答える
2

まったく同じエラーが発生し、プラグを抜いたり、Eclipseを再起動したりしましたが、何も機能していませんでした。最後に電話を再起動する必要があり、すべて元の位置に戻りました;)

私を正しい道に導いてくれてありがとう!!

于 2013-12-22T12:33:19.507 に答える
2

ファイルシステムのロックが長引いているようです。コードに触れずに修正しました。USBケーブルを抜いて再度差し込んだのだと思います。

于 2012-10-26T07:34:02.643 に答える