Android не хватает памяти при выборе второго изображения
Мое приложение работает, выходя из основной активности, запускает вторую активность, отображает изображение, выбранное пользователем, и анализирует изображение.
После анализа первого изображения я использовал кнопку "Назад", чтобы вернуться к основному упражнению и снова перейти ко второму упражнению, чтобы выбрать второе изображение. Но как только пользователь выбирает второе изображение, андроид выдаёт мне ошибку нехватки памяти. Я пытался отслеживать доступную память. Странно то, что прямо перед выбором второго изображения доступно еще больше памяти, чем до выбора первого изображения. Как мне решить эту проблему? Спасибо!
PS код исчерпывает память в BitmapFactory.decodeFile(picturePath);
2 ответа
Если вы работаете на оборудовании до 3.0, значение памяти, которое вы видите, не будет включать в себя память, используемую растровыми изображениями, так что это возможная причина для описанного вами поведения.
Как правило, вы всегда должны проверять размер изображения, которое ваше приложение извлекает динамически (либо по выбору пользователя, либо из сети), и масштабировать его до размера, который имеет смысл для вашего приложения. Например, для приложения "Галерея" оно должно масштабировать изображение, которое принимает телефон, до размеров экрана. Ниже приведен пример кода для декодирования масштабированного растрового изображения:
private Bitmap decodeFile(File f, int width_tmp, int height_tmp, int maxSize) {
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
InputStream in = new FileInputStream(f);
BitmapFactory.decodeStream(in, null, o);
try {
in.close();
} catch (IOException e1) {
}
// Find the correct scale value. It should be the power of 2.
int scale = 1;
while (maxSize > 0) {
if (width_tmp / 2 < maxSize
|| height_tmp / 2 < maxSize) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale++;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
in = new FileInputStream(f);
Bitmap bm = BitmapFactory.decodeStream(in, null, o2);
try {
in.close();
} catch (IOException e1) {
}
return bm;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
Предполагая, что вы используете класс Bitmap, вы должны вызывать метод recycle(), когда закончите с экземпляром Bitmap.
@Override
protected void onDestroy(){
super.onDestroy();
mBitmap.recycle();
}