При каждом изменении ориентации приложение перезагружается полностью, за исключением статических свойств.(читайте здесь: http://developer.android.com/reference/android/app/Activity.html)
Это означает, что все растровое изображение, которое вы разместили, если оно не было статичным, будет перезагружено. Поскольку память, разрешенная для одного приложения, составляет 16 МБ (24 на некоторых устройствах, которые я слышу), и этоточечные рисунки хранятся в памяти как необработанные точечные рисунки (читай не сжатые), что создает скачок в использовании памяти, который может привести к OOM
Добавьте к этому тот факт, что память, используемая для растровых изображений, выделяется за пределами вашей динамической памятино считается частью этого, так что вы на самом деле не можете отследить эту проблему, даже используя ddms или MAT.
Обязательно перерабатывайте все свои растровые изображения в методе onDestroy, чтобы они могли собираться мусором.
Единственное, что наконец-то меня вытащило из этого, это три строчки кода (хак):
System.gc();
System.runFinalization();
System.gc();
Но будьте осторожны, это влияет на производительность (от 500 до 750 мс), поэтомуне подходит для игры с проблемой FPS, но для приложения это вполне разумно.
Поместите их в самое начало вызова createScaledBitmap.
Это сработало для меня
Редактировать:
В зависимости от того, что вы делаете с рассматриваемым растровым изображением, вы можете попросить андроида открыть его с пониженной выборкой, занимая меньше памяти,Я написал эту функцию, имея дело с этой проблемой.Он пытается открыть растровое изображение как можно большего размера:
private Bitmap getDownsampledBitmapFromFile(String fileName, int sampleSize) {
//Try to free up some memory
System.gc();
System.runFinalization();
System.gc();
BitmapFactory.Options options=new BitmapFactory.Options();//reset object
byte[] tempBuffer=new byte[8000];
options.inTempStorage = tempBuffer;
options.inSampleSize=sampleSize;
Bitmap downsampledBitmap = null;
try {
downsampledBitmap = BitmapFactory.decodeFile(fileNameToUpload, options);
} catch (OutOfMemoryError e) {
sampleSize ++;
}
return(downsampledBitmap);
}