68 votes

OutOfMemoryError: la taille du bitmap dépasse le budget de la machine virtuelle: - Android

Double Possible:
Android: Étrange, hors de question de la mémoire lors du chargement d'une image à un objet Bitmap

je suis le téléchargement des images à partir de l'Url et de les afficher. Au moment du téléchargement c'est de donner des out of memory error : bitmap size exceeds VM budget. Je suis à l'aide de drawable. Le Code est ci-dessous:

HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();

Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap = Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();

Voici l'erreur: 05-28 14:55:47.251: ERROR/AndroidRuntime(4188): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

32voto

Sando Points 689

Utilisez decodeStream(is, outPadding, opts) avec

 BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false;                     //Disable Dithering mode
opts.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024]; 
 

6voto

Samuh Points 16564

Vous pouvez vérifier la taille de l'image, puis la réduire par un facteur approprié.

Voir cette question: Gestion de grandes images bitmap

2voto

Sephy Points 18893

Ce problème semble avoir été signalé à plusieurs reprises, ici et ici par exemple... désolé Shalini, mais si c'est le même problème, il semble qu'il n'y a pas de solution à tous les...

Le seul conseil que de Romain Guy est d'utiliser moins de mémoire...

Donc, bonne chance à penser que votre choses différemment...

1voto

Rorist Points 420

Enfin, après avoir rééchantillonné l'image comme suggéré ci-dessus, vous pouvez appeler bitmap_file.recycle () .

0voto

Fran Points 631

Le FAIT est qu'il y a un BUG sur certaines versions d'Android, en particulier la version 2.1 de l'échec de tous les temps avec des questions comme celle-ci.

J'ai publié une application dans laquelle j'ai pris beaucoup de soins sur l'utilisation des ressources. J'ai même supprimé un grand nombre d'images qui je l'utiliser et maintenant, ils sont créés à la volée à l'aide de primitives graphiques. J'ai aussi recycler les bitmaps lorsque vous ne les utilisez. Et bien sûr, j'ai vérifié que je n'ai pas de fuites de mémoire dans mon application: l'utilisation de la mémoire ne se développent PAS sans contrôle, il garde tout le temps dans des valeurs raisonnables.

Même si je dois investir beaucoup d'efforts à essayer d'éviter ce problème, je continue à avoir beaucoup de gênant exceptions comme celle de 2.1 et 2.1-update1 appareils. Je suis à l'aide de critercism maintenant se bloque, et j'ai vu qu'Il se produit même lorsque l'application est en utilisant seulement 4 mo de RAM, quatre fois moins que les 16M de taille de segment de mémoire que chaque appareil Android doit avoir une application -et le fait est que la plupart des appareils, de nos jours, les tailles de tas plus gros que 16M-.

Tous mes bitmaps ont une taille de 800 x 480 pixels, que dans le pire des cas comme ARGB_8888 ne peut pas occuper plus de 1,5 MO chacun, mais il bloque une tentative de chargement d'un en ayant seulement 4 méga-octets occupés, donc il devrait y avoir au moins un autre 12 MO d'espace libre. Et la plupart de mes images sont chargées en tant que ARGB_4444 qui occupe la moitié de la mémoire, je ne l'utilise ARGB_8888 lorsque les bitmaps à l'air vraiment mauvais avec 4444.

Donc pour moi il est assez clair qu'il y a quelque chose sur ces versions d'Android qui ne fonctionne pas bien. 99'9% de ces accidents vient de 2.1 et 2.1-mise à jour, et le reste peut être expliqué par d'autres ponctuel raisons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X