2014-06-13 2 views
2

J'utilise un bitmap. Il jette une erreur de mémoire (2 fois sur 5). Comment cela peut-il être évité?

Après mon code:Erreur de mémoire insuffisante dans le bitmap Android

bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri); 
    photo_new= rotateImage(bitmap, 90); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

    photo_new.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 

    Intent i = new Intent(getApplicationContext(),new_class.class); 
    i.putExtra("image", byteArray); 

    startActivity(i); 
    byteArray=null; 
+0

Il fonctionne très bien sur les différentes images? Quelles sont les différences. Et à quel point il jette une erreur de mémoire? – Eypros

+0

Quelle est la taille de ces bitmaps? – Dawnkeeper

+0

il lance erreur sur: 'bitmap = android.provider.MediaStore.Images.Media.getBitmap (cr, imageUri);' – user1619306

Répondre

4

Vous obtenez OutOfMemoryError parce que vous avez pas recycle les bitmaps que vous avez utilisé

essayer de recycle les bitmaps après que vous les avez utilisés

bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri); 
    photo_new= rotateImage(bitmap, 90); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

    photo_new.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 
    bitmap.recycle(); 
    Intent i = new Intent(getApplicationContext(),new_class.class); 
    i.putExtra("image", byteArray); 

    startActivity(i); 
    byteArray=null; 
+0

Merci .. !!! ça a marché pour moi :) – user1619306

2
byte[] byteArray = stream.toByteArray(); 

dans cette ligne de votre RAM est rempli par tout se Bitmap. Changement de la qualité bitmap de 100 à 50-60 comme ci-dessous

photo_new.compress(Bitmap.CompressFormat.JPEG, 50, stream); 

ou

photo_new.compress(Bitmap.CompressFormat.JPEG, 60, stream); 

essayer à la fois et voir les résultats.

-1

gérer l'exception,

try{ 

//put your code here 


}catch(OutOfMemoryError e){ 

} 
+0

Cela ne résout pas le problème et est seulement utile pour le débogage. Et pour le débogage, vous devez au moins imprimer la trace de la pile ou enregistrer l'erreur. – Dawnkeeper

+0

Quelles que soient les images que vous avez compresser ces images et recycler l'image bitmap – Harshad07

0

mauvais

1). La qualité de l'image bitmap est élevée.

2). vous n'utilisez pas try catch.

Suggestions

1). réduire la qualité de bitmap à 45-50.

2). Utilisez try catch block pour empêcher votre application de plantage.

Solution // activité de l'expéditeur

try{ 
    Intent _intent = new Intent(this, newscreen.class); 
    Bitmap _bitmap; // your bitmap 
    ByteArrayOutputStream _bs = new ByteArrayOutputStream(); 
    _bitmap.compress(Bitmap.CompressFormat.PNG, 50, _bs); 
    i.putExtra("byteArray", _bs.toByteArray()); 
    startActivity(i); 
}catch(Exception e){ 
} 
activité du récepteur

try{ 
    if(getIntent().hasExtra("byteArray")) { 

    ImageView _imv= new ImageView(this); 
    Bitmap _bitmap = BitmapFactory.decodeByteArray(      getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);   
    _imv.setImageBitmap(_bitmap); 
} 
}catch(Exception e){ 
} 
Questions connexes