1

アプリにはファイルから文字列へのプロセスが 2 つあります (1 つは実際にはアセット ファイルを処理します)。
これらのプロセスのいずれかを同じファイルに対して数回繰り返すと、OutOfMemoryErrors が発生します。
ストリームを適切に閉じていないため、複数のストリームが作成されている可能性があり、これがアプリのメモリ不足を引き起こしている可能性があります。
2 つのプロセスのコードは次のとおりです。

私の資産ファイルから文字列へのプロセス。
ご覧のとおり、ストリームを閉じるための何かが用意されていますが、適切にフォーマットされているかどうかはわかりません。

try 
{
      myVeryLargeString = IOUtils.toString(getAssets().open(myAssetsFilePath), "UTF-8");
      IOUtils.closeQuietly(getAssets().open(myAssetsFilePath));
} 
catch (IOException e) 
{
      e.printStackTrace();
}
catch(OutOfMemoryError e)
{
      Log.e(TAG, "Ran out of memory 01");
}



私のファイルから文字列へのプロセス。
このストリームを閉じる方法がわかりません(閉じるストリームさえある場合)。

myFile01 = new File(myFilePath);
try 
{
      myVeryLargeString = FileUtils.readFileToString(myFile01, "UTF-8");
} 
catch (IOException e) 
{
      e.printStackTrace();
}
catch(OutOfMemoryError e)
{
      Log.e(TAG, "Ran out of memory 02");
}
4

1 に答える 1

3

OOME の原因を特定するのは困難ですが、このような形で終了する必要があります

InputStream is = getAssets().open(myAssetsFilePath);
try {
    myVeryLargeString = IOUtils.toString(is, "UTF-8");
} finally {
    IOUtils.closeQuietly(is);
}
于 2013-07-01T04:02:29.560 に答える