2010-02-03 12 views
20

Tengo una aplicación muy simple con un ImageView y un botón. El primer recurso Disponibles cargado por mi ImageView se especifica con el "android: src" etiqueta en el diseño de XML, sin embargo, en tiempo de ejecución quiero cambio de la imagen mostrada por ella. Para hacerlo, comienzo una Actividad para el resultado para elegir una imagen de la tarjeta SD (intento enviado a MediaStore.Images.Media.EXTERNAL_CONTENT_URI). Sin embargo, cuando se selecciona la imagen, trato de actualizar el ImageView con el URI de la imagen elegida, pero me sale el mensaje "java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto VM"ImageView causa OutOfMemoryError

I'am intentar cargar imágenes tomadas con la cámara (el tamaño de las fotos es alrededor de 1.1M) de mi HTC-Hero pero sin éxito, parece funcionar solo con imágenes que son menos de 500KB. Sin embargo, necesito cargar las fotos tomadas con la cámara. ¿Cómo puedo resolver esto? qué estoy haciendo mal. Me parece que el código es muy simple y debería funcionar.

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. eso es lo único que debe hacer la aplicación, no crearé otros objetos, así que me gustaría señalar que no estoy usando el espacio de almacenamiento para otras cosas además de mostrar la imagen.

Respuesta

43

parece que antes de cargar un nuevo mapa de bits que tenía que reciclar el mapa de bits que muestra el ImageView, ahora funciona sin ningún problema. Espero que esto ayude a otra persona, solo llame al siguiente método antes de configurar el nuevo contenido de ImageView.

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

lo que el código se verá así:

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

Tenga en cuenta la llamada a reciclar en el mapa de bits de la ImageView.

2

El problema ha sido resuelto. en lugar de sólo una línea:

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

añadir este código antes de actualizar el contenido ImageView:

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

Esto me estaba volviendo loco.

Estoy construyendo un Xoom con muy grandes, de alta resolución, imágenes de pantalla completa (800x1232).

El siguiente código que funcionó para mí:

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

Buena suerte !!!

+0

Este método lo salvará si está utilizando un FragmentStatePagerAdapter con ImageViews ya que al reciclar el mapa de bits se producirá un error al volver a inflar la vista. –

1

de utilizar esta actualización antes de imageview: imageView1.setImageURI (null);

1

Utilicé cada solución de esta publicación y muchas más, pero nadie funcionó. Finalmente utilicé android:largeHeap="true" en manifiesto y eso resuelve mi problema.

Espero que esto ayude a alguien.