我正在尝试将SD卡上的所有图像文件(连接到运行4.0.4的root设备)连接到连接到同一设备的硬盘驱动器。我是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 freed aK, b% free cK/dK, paused ems+fms
a
,b
,c
,d
, e
和f
是不同的数字。我长时间不停地(只要我等待)没有任何其他图像被复制。
我理解(我想我还是这样做)这是因为堆已满并且Dalvik正试图释放内存。但是,我不确定如何阻止这种情况发生,该程序应该能够复制更多(可能是数千)图像。也许apache公共文件FileUtils类对于Android来说太重了,在这种情况下是否有另一个Android友好的文件库来处理整洁的文件或者我必须编写自己的简单库?或者也许我在其他地方出错了。
非常感谢任何帮助。
提前致谢。
答案 0 :(得分:-1)
这很可能是一个非问题。 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复制方法也使用缓冲区。