2013-06-05 1 views
0

J'ai 2 ImageView sur ma mise en page d'accueil et leur contenu provient des images placées sur la carte SD comme indiqué dans ci-dessous extrait de code:OutOfMemoryError lors de l'utilisation 2 bitmaps

try { 
     String tempPath1 = Environment.getExternalStorageDirectory() 
       + File.separator + "Clipping_Pictures" + File.separator 
       + "06-05-2013_02-06-09pm.png"; 
     File f = new File(tempPath1); 
     Bitmap b = null, b2 = null; 
     b = BitmapFactory.decodeFile(f.getPath()); 

     if (f.exists()) { 
      ivClip1.setImageBitmap(b);//ivClip1 is ImageView 
     } 

     tempPath1 = Environment.getExternalStorageDirectory() 
       + File.separator + "Clipping_Pictures" + File.separator 
       + "06-05-2013_02-06-33pm.png"; 
     f = new File(tempPath1); 
     b2 = BitmapFactory.decodeFile(f.getPath()); 

     if (f.exists()) { 
      ivClip2.setImageBitmap(b2); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Quand je charge l'application pour la 1ère fois, il affiche les deux images sur les images respectives. Mais 2ème lancement sur-salles, application se bloque à l'exception suivante:
OutOfMemoryError: la taille du bitmap dépasse le budget VM

Notez que deux images de ressources sont .png et de la taille ~ 850KB chacun qui devrait être bien J'imagine.

Il existe des threads similaires sur SO et sur Internet et j'ai essayé certaines de leurs solutions suggérées, mais aucune ne semble fonctionner.

Toute aide appréciée.

+0

« Notez que deux images de ressources sont .png et de la taille ~ 850kb 'ça n'a pas d'importance. Quelle est la largeur et la hauteur de votre bitmap? – Blackbelt

+0

C'est environ. 2000x2600 – GAMA

+1

chaque bitmap nécessitera environ 20 Mo de mémoire. Un bitmap nécessitera largeur * hauteur * 4 octets de mémoire – Blackbelt

Répondre

1

en raison de la grande taille de vos bitmaps. compresser votre bitmap en utilisant le code suivant:

Bitmap ShrinkBitmap(byte[] file, int width, int height){ 

     BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
      bmpFactoryOptions.inJustDecodeBounds = true; 
      Bitmap bitmap = BitmapFactory.decodeByteArray(file, 0, file.length, bmpFactoryOptions); 


      int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height); 
      int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width); 

      if (heightRatio > 1 || widthRatio > 1) 
      { 
      if (heightRatio > widthRatio) 
      { 
       bmpFactoryOptions.inSampleSize = heightRatio; 
      } else { 
       bmpFactoryOptions.inSampleSize = widthRatio; 
      } 
      } 

      bmpFactoryOptions.inJustDecodeBounds = false; 
      bitmap = BitmapFactory.decodeByteArray(file, 0, file.length, bmpFactoryOptions); 
     return bitmap; 
     } 
+0

Le premier paramètre est le fichier 'byte []. Si j'envoie 'Bitmap bitmap', alors' Bitmap bitmap = BitmapFactory.decodeByteArray (fichier, 0, fichier.length, bmpFactoryOptions); 'va changer en Bitmap bitmap = BitmapFactory.decodeByteArray (bitmap, bmpFactoryOptions);', right ? – GAMA

+0

venez discuter discussion .. – Riser

+0

m désolé mais je n'ai pas beaucoup d'idée sur la session de chat. Pouvez-vous me donner le lien de chat? – GAMA

1

Exécutez-vous tout ce code à partir de onCreate() ou de onResume()? Vous pouvez essayer de nettoyer les vues avant de réessayer de charger les images (ivClip1.setImageBitmap (null) ou léger), car pendant que vous décodez les deux bitmaps, vous avez toujours les instances précédentes en mémoire en affichant .

+0

dans 'onCreate()'. Que veux-tu dire par nettoyer les vues? – GAMA

+0

J'ai suggéré d'appeler ivClip1.setImageBitmap (null), si cela ne fonctionne pas, vous pouvez essayer de définir une petite image vide (par exemple une image de marqueur qui peut dire "chargement") ivClip1.setImageResource (R.drawable.my_little_marker_image) ; – DNax

3

Si vous construisez votre application pour Android 3.0 dans les salles, vous pouvez utiliser android:largeHeap="true" attribut dans votre balise d'application du fichier manifeste. Pour ce faire, nous espérons que votre application ne plantera pas en raison d'un manque de mémoire.

est par exemple ici:

demande

android:allowBackup="true" 
android:icon="@drawable/icon_96x96" 
android:label="@string/app_name" 
android:largeHeap="true" 
android:theme="@android:style/Theme.NoTitleBar" 

Merci!

+0

Oh pitié. Le support minimum pour mon application est v2.2 :( – GAMA

+0

+1 pour la propriété 'android: largeHeap' – sabadow

1

Vous pouvez ajouter ces lignes à redimensionner bitmap, puis utiliser

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 8; 
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file),null,options); 

méthode de calcul sampleSize et réduire la taille du bitmap

private Bitmap decodeFile(File f){ 
    try { 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     final int REQUIRED_SIZE=70; 

     //Find the correct scale value. It should be the power of 2. 
     int scale=1; 
     while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE) 
      scale*=2; 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) {} 
    return null; 
} 
+0

comment est-ce que vous atteignez ce ** 8 **? – GAMA

+0

il est codé en dur, si vous ne voulez pas coder en dur 8 alors voir le édité réponse – Nirali

+0

c'est similaire à http://stackoverflow.com/questions/16915619/reducing-bitmapdrawable-size/16915719#16915719 droite ???? – GAMA

Questions connexes