2

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 freed aK, b% free cK/dK, paused ems+fms。他の画像がコピーされることなく、このノンストップを長い間(待っている限り)取得します。abcdef

これは、ヒープがいっぱいで、Dalvik がメモリを解放しようとしていることが原因であることを理解しています (とにかくそうだと思います)。しかし、どうすればこのようなことが起こらないようにすることができるかわかりません。プログラムはさらに多くの (場合によっては数千の) 画像をコピーできるはずです。おそらく、apache commons FileUtils クラスは Android には重すぎます。その場合、適切なファイル処理のための別の Android 対応ライブラリがあるか、独自の単純なものを作成する必要がありますか? それとも、どこかで間違っているのかもしれません。

どんな助けでも大歓迎です。

前もって感謝します。

4

1 に答える 1

-1

これはおそらく問題ではありません。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 copy メソッドもバッファを使用しているため、疑問があります。

于 2012-12-03T05:05:07.130 に答える