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

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

I'am, пытающийся загрузить снимки, сделанные камерой (размер рисунков вокруг 1.1M) моего HTC Hero, но никакого успеха, кажется, работает только с изображениями, которые являются меньше, чем 500KB.However, я должен загрузить снимки, сделанные камерой. Как я могу решить это? что я делаю неправильно. Кажусь мне, что код очень прост и должен работать.

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., который является единственной вещью Приложение, должен сделать, я не создаю другие объекты, таким образом, мне понравится указывать, что я не использую пространство "кучи" для другого материала помимо отображения изображения.

20
задан Solin 3 February 2010 в 11:11
поделиться

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.

43
ответ дан 29 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: