我正在尝试将 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();
}
但是,当我运行此程序时,在复制 36 张图像后,我开始不断获取 GC_CONCURRENT free aK, b% free cK/dK, paused ems+fms
where a
、b
、c
、d
、e
和f
是不同的数字。我很长一段时间(只要我一直在等待)就不停地得到这个,而没有任何其他图像被复制。
我明白(无论如何我想我明白)这是因为堆已满并且 Dalvik 正在尝试释放内存。但是,我不确定如何才能阻止这种情况发生,该程序应该能够复制更多(可能是数千张)图像。也许 apache commons FileUtils 类对于 Android 来说太重了,在这种情况下是否有另一个 Android 友好的库来处理整洁的文件,或者我必须编写自己的简单库?或者我在其他地方出错了。
非常感谢任何帮助。
提前致谢。
最佳答案
这很可能不是问题。 GC 是应用程序处理的正常部分。事实上,我敢打赌,如果您的应用正忙于执行缓慢的 IO,系统已经决定现在是进行一些清理的好时机。
当然,FileUtils 的源代码是开放的。它不是特别可怕:
唯一可以说“臃肿”的是创建复制缓冲区。默认为 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/