java - 使用 org.apache.commons.io.FileUtils 时 Android 内存泄漏

标签 java android dalvik

我正在尝试将 SD 卡(连接到运行 4.0.4 的 Android 设备)上的所有图像文件复制到连接到同一设备的硬盘驱动器。我是 Android 编程的新手,如果问题的答案显而易见,请原谅我。

我使用从服务的 onHandleIntent(Intent intent) 调用的以下方法来复制:

private void copyImages(File sourceDirectory, File destinationDirectory) throws IOException {
    int count = 0;
    IOFileFilter imageFilter = new ImageFilter();
    IOFileFilter visibleDirectoryFilter = new VisibleDirectoryFilter();

    long startTime = System.nanoTime();
    if (sourceDirectory.exists() && destinationDirectory.exists()) {
        Collection<File> fileList = FileUtils.listFiles(sourceDirectory, imageFilter, visibleDirectoryFilter);
        for (File image : fileList) {               
            FileUtils.copyFileToDirectory(image, destinationDirectory);
            count++;
        }
    }

    long totalTime = System.nanoTime() - startTime;
    Toast.makeText(this, count + " files copied in " + (totalTime) + " nanos.", Toast.LENGTH_LONG).show();
}

但是,当我运行此程序时,在复制 3​​6 张图像后,我开始不断获取 GC_CONCURRENT free aK, b% free cK/dK, paused ems+fms where abcdef是不同的数字。我很长一段时间(只要我一直在等待)就不停地得到这个,而没有任何其他图像被复制。

我明白(无论如何我想我明白)这是因为堆已满并且 Dalvik 正在尝试释放内存。但是,我不确定如何才能阻止这种情况发生,该程序应该能够复制更多(可能是数千张)图像。也许 apache commons FileUtils 类对于 Android 来说太重了,在这种情况下是否有另一个 Android 友好的库来处理整洁的文件,或者我必须编写自己的简单库?或者我在其他地方出错了。

非常感谢任何帮助。

提前致谢。

最佳答案

这很可能不是问题。 GC 是应用程序处理的正常部分。事实上,我敢打赌,如果您的应用正忙于执行缓慢的 IO,系统已经决定现在是进行一些清理的好时机。

当然,FileUtils 的源代码是开放的。它不是特别可怕:

http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/FileUtils.java#FileUtils.doCopyFile%28java.io.File%2Cjava.io.File%2Cboolean%29

唯一可以说“臃肿”的是创建复制缓冲区。默认为 4K: http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/IOUtils.java#IOUtils.copyLarge%28java.io.InputStream%2Cjava.io.OutputStream%29

我不会太担心这个,除非您可以将真正的问题隔离到该代码。

从性能的角度来看,您可能想要测试 BufferedInputStream/OutputStream 是否在此处提供任何优势。有问题,因为 IOUtils 复制方法也在使用缓冲区。

关于java - 使用 org.apache.commons.io.FileUtils 时 Android 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675886/

相关文章:

java - Java中打印两个DNA字符串之间对应的数字串

Android:getSupportActionBar() 在 ActionBarSherlock 库中总是返回 null

android - 为什么invoke-kind/range指令中指示的寄存器数量与参数类型的数量不匹配?

android - Android的dex代码自动转换

java - 在 JPanel 的一部分中绘制而不重新绘制其余部分

java - 我在哪里定义 http ://localhost:8080/"homepage"

java - 多次插入 SQL 数据库

java - 如何使用 PhoneGap CLI 将更改应用到 Android Cordova 应用程序 Java 源文件?

android - 从路径创建 BitmapDrawable

android - 如何在 IntelliJ IDEA(社区版)中使用 Scala 源构建 Android 项目?