2010-02-03 23 views
20

Ho un'applicazione molto semplice con un ImageView e un pulsante. La prima risorsa disegnabile caricata dal mio ImageView è specificata con il tag "android: src" nel layout XML, tuttavia in fase di esecuzione voglio cambiare l'immagine visualizzata da esso. Per farlo, avvio un'attività per il risultato di prelevare un'immagine dalla scheda SD (intento inviato a MediaStore.Images.Media.EXTERNAL_CONTENT_URI). Tuttavia quando è selezionata la foto, cerco di aggiornare l'ImageView con URI del Picture scelto, ma ottengo il messaggio "java.lang.OutOfMemoryError: formato bitmap supera bilancio VM"Modifica del contenuto ImageView causa OutOfMemoryError

I'am cercando di caricare immagini scattate con la fotocamera (le dimensioni delle foto sono circa 1.1M) del mio HTC-Hero ma senza successo, sembra funzionare solo con le immagini che sono meno di 500KB. Tuttavia ho bisogno di caricare le immagini scattate con la fotocamera. Come posso risolvere questo? cosa sto sbagliando. Mi sembra che il codice sia molto semplice e dovrebbe funzionare.

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. questa è l'unica cosa che l'App dovrebbe fare, non sto creando altri oggetti, quindi mi piacerebbe sottolineare che non sto usando lo spazio heap per altre cose oltre a visualizzare l'immagine.

risposta

43

Sembra che prima di caricare una nuova bitmap dovessi riciclare la bitmap visualizzata da ImageView, ora funziona senza problemi. Spero che questo aiuti qualcun altro, basta chiamare il metodo seguito prima di impostare il nuovo contenuto di ImageView.

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

modo che il codice appare come segue:

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

Si prega di notare la chiamata di riciclare sul Bitmap del ImageView.

2

Il problema è stato risolto. piuttosto che una sola linea:

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

aggiungere questo codice prima di aggiornare il contenuto ImageView:

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

Questo mi stava facendo impazzire.

Sto costruendo uno Xoom con immagini a schermo intero molto grandi, ad alta risoluzione (800x1232).

Il seguente codice ha funzionato per me:

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

Buona fortuna !!!

+0

Questo metodo consente di risparmiare se si sta utilizzando FragmentStatePagerAdapter con ImageViews poiché il riciclo della bitmap causerà un errore durante il rigonfiamento della vista. –

1

utilizzare solo questo prima di aggiornare l'immagine: imageView1.setImageURI (null);

1

Ho usato ogni soluzione di questo post e molti altri ma nessuno ha funzionato. Infine ho usato android:largeHeap="true" in manifest e questo risolve il mio problema.

Spero che questo aiuti qualcuno.

Problemi correlati