2013-08-07 6 views
0

Мое приложение работает, выходя из основного действия, запускает второе действие, отображает изображение, выбранное пользователем, и анализирует изображение.Ошибка Android из памяти при выборе второго изображения

После анализа первого изображения я использовал кнопку «Назад», чтобы вернуться к основному действию, и повторю вторую операцию, чтобы выбрать второе изображение. Но как только пользователь выбирает второе изображение, андроид дает мне ошибку в памяти. Я попытался отслеживать доступную память. Странная вещь заключается в том, что перед тем, как выбрано второе изображение, доступно еще больше памяти, чем до того, как будет выбрано первое изображение. Как мне решить это? Спасибо!

PS В коде заканчивается код BitmapFactory.decodeFile (picturePath);

ответ

0

Если вы работаете на заранее 3.0 аппаратных средств, значение памяти вы видите невключают память, используемую Bitmaps, так что это возможная причина поведения, которую вы описали.

Как правило, вы всегда должны проверять размер изображения, которое ваше приложение извлекает динамически (либо из пользовательского выбора, либо из сети), и масштабирует его до размера, который имеет смысл для вашего приложения. Например, для приложения «Галерея» он должен перемасштабировать картинку, которую занимает телефон, в размер экрана. Ниже приведен пример кода для декодирования масштабированного растрового изображения:

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; 
} 
0

Предполагая, что вы используете класс Bitmap, вы должны вызвать метод recycle(), когда вы закончите с экземпляром растрового изображения.

@Override 
protected void onDestroy(){ 
    super.onDestroy(); 
    mBitmap.recycle(); 
}