Присвоение растрового изображения ImageView через setImageURI вызывает исключение OutOfMemory

У меня есть активность с пустым ImageView и кнопкой. После нажатия кнопки я показываю медиагалерею устройства, пользователь выбирает изображение, которое передается действию через намерение. Я использую URI изображения из возвращенных данных и заполняю ImageView следующим образом:

private ImageView pic;

@Override
public void onCreate(Bundle savedInstanceState) 
{

      pic = (ImageView)findViewById(R.id.bbChildImage);

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{  

        if(resultCode == RESULT_OK)
        {   
            URI currImageURI = data.getData();
            pic.setImageURI(currImageURI);
        }
}

Теперь, если я выберу другое изображение из галереи, после возврата данных я получу исключение OutOfMemory, связанное с растровым изображением.

Я нашел два способа избавиться от него. Я либо делаю это перед назначением URI:

((BitmapDrawable)pic.getDrawable()).getBitmap().recycle();

или вместо того, чтобы назначать URI представлению, я сначала получаю растровое изображение, а затем назначаю его, например:

Bitmap thumbnail = MediaStore.Images.Media.getBitmap(this.getContentResolver(), currImageURI);
pic.setImageBitmap(thumbnail);

Я не уверен, какой из них лучше. Кроме того, если есть лучшие способы, я был бы признателен за обратную связь.

Спасибо.


person oviroa    schedule 02.08.2011    source источник
comment
Это размер изображения, снятого камерой устройства, поэтому может быть от 1 до 3 мегабайт, в зависимости от устройства.   -  person oviroa    schedule 02.08.2011
comment
ваш первый подход лучше   -  person ingsaurabh    schedule 02.08.2011
comment
@ingsaurabh, можешь объяснить почему?   -  person oviroa    schedule 02.08.2011
comment
потому что во втором подходе вы не освобождаете память, поэтому рано или поздно вы снова получите OOM. Всегда полезно переработать растровое изображение, как только вы закончите с этим, для получения дополнительной информации проверьте это stackoverflow.com/questions/6213690/   -  person ingsaurabh    schedule 02.08.2011


Ответы (1)


  1. Переработка, как правило, путь. Если растровое изображение вам не нужно, сообщите об этом операционной системе, переработав его.

  2. В дополнение к этому я бы использовал BitmapFactory для создания растрового изображения и использовал параметры для его сжатия при загрузке. Не делайте его больше экрана устройства. Это сэкономит много памяти.

person EboMike    schedule 02.08.2011
comment
как мне сделать растровое изображение с помощью BitmapFactory, если намерение отправило обратно URI? - person oviroa; 02.08.2011
comment
Вот несколько примеров: stackoverflow.com/questions /3879992/ - person EboMike; 02.08.2011
comment
Кроме того, я могу сделать это только для отображения, но мне все еще нужно полное растровое изображение, потому что мне нужно загрузить его через веб-службу. - person oviroa; 02.08.2011