我的应用程序中有一个奇怪的错误。

在我的应用程序中,可以下载一个zipFile,按原样读取内容,也可以将其删除。到底是什么无关紧要。

问题:只有在Motorola Xoom(版本4.0.4)上,我才能下载文件,解压缩文件,读取数据并删除所有内容。
但是,如果我尝试再次下载文件,并在将其解压缩并将文件复制到SD卡时将其崩溃,并显示错误EBUSY(设备或资源繁忙)。

  • 为什么只能在第一次使用?
  • 什么意思是错误?
  • 为什么仅在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。我们也遇到了华硕Transformer(版本4.0.4)的错误

    最佳答案

    我有一个很大的答案!
    问题来自Android系统或/和FAT32系统。
    我无法解释系统是如何得到该错误的,它与删除文件和FAT32系统有关。

    但是解决方案确实很简单:
    在删除目录或文件之前:重命名!

    重命名代码:

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

    就是这样,如果在删除文件夹或文件之前重命名了该文件夹或文件,则系统将没有机会尝试再次打开现有文件或要再次保存的打开文件(或类似文件)。

    10-07 21:43