Подтвердить что ты не робот

Изменение содержимого ImageView вызывает OutOfMemoryError

У меня очень простое приложение с одним ImageView и Button. Первый ресурс Drawable, загруженный моим ImageView, указан в теге "android: src" в макете XML, однако во время выполнения я хочу изменить отображаемое им изображение. Для этого я запускаю операцию для получения изображения с SD-карты (намерение отправлено в MediaStore.Images.Media.EXTERNAL_CONTENT_URI). Однако, когда выбрано изображение, я пытаюсь обновить ImageView с выбранным URI изображения, но я получаю сообщение " java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет VM"

Я пытаюсь загрузить снимки, сделанные с помощью камеры (размер файла около 1,1 М) моего HTC-Hero, но без успеха, похоже, работает только с изображениями, размер которых меньше 500 КБ. Однако мне нужно загружать сделанные снимки с камерой. Как я могу это решить?, что я делаю неправильно. Мне кажется, что код очень прост и должен работать.

public void onClick(View v){
 Intent selectImageIntent=new Intent(Intent.ACTION_PICK , 
   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
   startActivityForResult(selectImageIntent,1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
 super.onActivityResult(requestCode, resultCode, data);
 if(resultCode==Activity.RESULT_OK){
   Uri selectedImageUri = data.getData();
   Log.i(TAG,"chosen image: "+selectedImageUri.toString());
   ImageView imageView = (ImageView) this.findViewById(R.id.ImageView01);
   imageView.setImageURI(selectedImageUri);//here I get the OutOfMemoryError
   imageView.invalidate();

 }else{
  //canceled
 }

}

p.s. это единственное, что должно делать приложение, я не создаю другие объекты, поэтому я хотел бы указать, что я не использую пустое место для других вещей, кроме отображения изображения.

4b9b3361

Ответ 1

Похоже, что перед загрузкой нового Bitmap мне пришлось переработать Bitmap, отображаемый ImageView, теперь он работает без проблем. Надеюсь, что это поможет кому-то другому, просто вызовите следующий метод перед настройкой нового содержимого ImageView.

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

поэтому код теперь выглядит следующим образом:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode){
        case INTENT_REQUEST_SELECT_IMAGE:
            if(resultCode==Activity.RESULT_OK){
                Uri selectedImageUri = data.getData();
                Log.i(TAG,"selectedImageUri.getPath()"+selectedImageUri.getPath() );
                ImageView imageView = (ImageView) this.findViewById(R.id.ImageView_of_text);
                ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
                imageView.setImageURI(selectedImageUri);
                imageView.invalidate();

            }else{
                //TODO define what to do in case the user canceled OCR or any other event
            }
            break;
        default:
            break;
    }
}

Обратите внимание на призыв к переработке на растровом изображении ImageView.

Ответ 2

Это сводило меня с ума.

Я создаю Xoom с очень большими, привет-res, полноэкранными изображениями (800x1232).

Для меня работал следующий код:

public void onStop()
{
    super.onStop();
    imageView.setImageBitmap(null);
}

Удачи!!!

Ответ 3

Теперь проблема решена. а не только одну строку:

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

добавьте этот код перед обновлением содержимого ImageView:

Drawable toRecycle= gallerypic.getDrawable();
if (toRecycle != null) {
    ((BitmapDrawable)gallerypic.getDrawable()).getBitmap().recycle();
}
gallerypic.setImageURI(selectedimage);

Ответ 4

использовать это только перед обновлением imageview:   imageView1.setImageURI(нуль);

Ответ 5

Я использовал каждое решение этого сообщения и многое другое, но никто не работал. Наконец, я использовал android:largeHeap="true" в манифесте, и это решает мою проблему.

Надеюсь, это поможет кому-то.