2014-08-29 2 views
-2

Après beaucoup de tentatives grâce à tous les passionnés d'Android, j'ai trouvé une méthode pour gérer efficacement les grandes images dans les applications Android afin de se débarrasser de outOfMemory erreur. Mais je vraiment besoin de savoir est-ce la manière formelle correcte de le faire. ou Ai-je besoin d'ajouter un peu plus ou tout changement devrait être fait. S'il vous plaît commentaire.Est-ce la bonne façon de gérer efficacement les grandes images (pour éviter outOfMemoryErrorin Android

Bitmap bitmap1; 

iv1 = (ImageView) findViewById(R.id.iv1); 
iv2 = (ImageView) findViewById(R.id.iv2); 
iv3 = (ImageView) findViewById(R.id.iv3); 

BitmapFactory.Options o = new BitmapFactory.Options(); 
o.inJustDecodeBounds = true; 

BitmapFactory.decodeResource(getResources(), R.drawable.image1); 
BitmapFactory.decodeResource(getResources(), R.drawable.image2); 
BitmapFactory.decodeResource(getResources(), R.drawable.image3); 

int srcWidth = o.outWidth; 
int srcHeight = o.outHeight; 
int dstWidth = 600;   
int dstHeight = 450; 
int inSampleSize = 1;    
if (srcHeight > dstHeight || srcWidth > dstWidth) { 
      final int halfHeight = srcHeight/2; 
      final int halfWidth = srcWidth/2; 
      while ((halfHeight/inSampleSize) > dstWidth 
        && (halfWidth/inSampleSize) > dstWidth) { 
       inSampleSize *= 2; 
      } 
     }   
     o.inSampleSize = inSampleSize; 
     o.inJustDecodeBounds = false; 
     bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1, o); 
     iv1.setImageBitmap(bitmap1); 


     bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image2, o); 
     iv2.setImageBitmap(bitmap1); 
     Toast.makeText(getApplicationContext(), 
       "DEcoded", Toast.LENGTH_LONG).show(); 

     bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image3, o); 
     iv3.setImageBitmap(bitmap1); 



    @Override 
    protected void onDestroy() { 
     bitmap1.recycle(); 
     super.onDestroy(); 
     Toast.makeText(getApplicationContext(), 
       "Bitmap Destroyed", Toast.LENGTH_LONG).show(); 
    } 
+0

essayez ici http://codereview.stackexchange.com/ ... mais d'abord pensé que WTF ces lignes font 'BitmapFactory.decodeResource (getResources(), R.drawable.image1 à 2);' Savez-vous que dans 'o.outWidth' est seulement la largeur de la dernière image (image3)? – Selvin

+0

Je n'ai pas compris votre point. Pourriez-vous s'il vous plaît expliquer plus en détail. Merci. –

Répondre

1

Semble votre code est en train de faire la même L'idée est que si nous essayons d'afficher un bitmap dans une zone 300 * 300 View, nous n'avons pas besoin de le faire. ad le assez grand, disons 1000 * 1000 ressource bitmap à la mémoire. Juste obtenir le rapport d'aspect d'abord, puis le décoder à un bitmap relativement plus petit pour économiser de la mémoire (et éviter MOO).

Donc, je pense que cela devrait suffire.

+0

Merci pour la réponse. –

Questions connexes