web-dev-qa-db-fra.com

OutOfMemoryError: la taille du bitmap dépasse VM budget: - Android

Duplicata possible:
Android: problème de mémoire insolite lors du chargement d'une image dans un objet Bitmap

je télécharge des images depuis Url et les affiche. Au moment du téléchargement, il donne out of memory error : bitmap size exceeds VM budget. J'utilise 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

59
Andy

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]; 
31
Sando

Vous pouvez vérifier la taille de l'image, puis la sous-échantillonner en fonction du facteur approprié.

Voir cette question: Gestion des grands bitmaps

5
Samuh

Ce problème semble avoir été signalé plusieurs fois, ici et ici par exemple ... désolé Shalini mais si c'est le même problème, il semble qu'il n'y ait pas de solution du tout ...

Le seul conseil de Romain Guy est pour utiliser moins de mémoire ...

Alors, bonne chance pour penser différemment ...

2
Sephy

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

1
Rorist

J'ai essayé beaucoup de choses, c'est ce qui fonctionne.

BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false;                     //Disable Dithering mode
opts.inPurgeable=true;        
opts.inScale=8;
///after you use your images
System.gc();
0
Thefirstkilla

Le FAIT est qu'il existe un BUG sur certaines versions Android, en particulier la version 2.1 échoue tout le temps avec des problèmes comme celui-ci.

J'ai publié une application dans laquelle j'ai apporté beaucoup de soin à l'utilisation des ressources. J'ai même supprimé beaucoup de bitmaps que j'utilisais et maintenant ils sont créés à la volée à l'aide de primitives graphiques. Je recycle également les bitmaps lorsque je ne les utilise pas. Et bien sûr, j'ai vérifié que je n'ai aucune fuite de mémoire dans mon application: la mémoire utilisée ne croît PAS sans contrôle, elle reste tout le temps dans des valeurs raisonnables.

Bien que j'aie investi beaucoup d'efforts pour essayer d'éviter ce problème, je continue de recevoir de nombreuses exceptions gênantes comme celle des appareils 2.1 et 2.1-update1. J'utilise le critercisme maintenant pour signaler les plantages, et j'ai vu que cela se produit même lorsque l'application n'utilise que 4 mégaoctets de RAM, quatre fois moins que les 16 Mo de taille de tas que chaque Android appareil doit avoir pour une application -et le fait est que la plupart des appareils de nos jours ont des tailles de tas supérieures à 16M-.

Tous mes bitmaps ont une taille de 800x480 pixels, ce qui dans le pire des cas comme ARGB_8888 ne peut pas occuper plus de 1,5 Mo chacun, mais il se bloque en essayant d'en charger un lorsqu'il n'y a que 4 mégaoctets occupés, donc il devrait y avoir au moins 12 Mo supplémentaires libre. Et la plupart de mes bitmaps sont chargés en tant que ARGB_4444 qui occupe la moitié de la mémoire, j'utilise uniquement ARGB_8888 lorsque les bitmaps semblent vraiment médiocres avec 4444.

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

0
Fran Marzoa