Android - BitmapFactory.decodeByteArray - OutOfMemoryError (OOM)
J'ai lu 100s de l'article sur le OOM problème. La plupart sont en ce qui concerne les grandes images bitmap. Je suis en train de faire une application de cartographie où nous télécharger 256x256
météo superposition des tuiles. La plupart sont totalement transparentes et très petite. Je viens d'avoir un accident sur une image bitmap flux 442 Octets de long, tout en appelant BitmapFactory.decodeByteArray(....).
L'Exception des états:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=9415KB, Allocated=5192KB, Bitmap Size=23671KB)
Le code est:
protected Bitmap retrieveImageData() throws IOException {
URL url = new URL(imageUrl);
InputStream in = null;
OutputStream out = null;
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//determine the image size and allocate a buffer
int fileSize = connection.getContentLength();
if (fileSize < 0) {
return null;
}
byte[] imageData = new byte[fileSize];
//download the file
//Log.d(LOG_TAG, "fetching image " + imageUrl + " (" + fileSize + ")");
BufferedInputStream istream = new BufferedInputStream(connection.getInputStream());
int bytesRead = 0;
int offset = 0;
while (bytesRead != -1 && offset < fileSize) {
bytesRead = istream.read(imageData, offset, fileSize - offset);
offset += bytesRead;
}
//clean up
istream.close();
connection.disconnect();
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeByteArray(imageData, 0, bytesRead);
} catch (OutOfMemoryError e) {
Log.e("Map", "Tile Loader (241) Out Of Memory Error " + e.getLocalizedMessage());
System.gc();
}
return bitmap;
}
Ici a ce que je vois dans le débogueur:
bytesRead = 442
Donc les données de l'image est de 442 Octets. Pourquoi serait-il en train de créer un 23671KB Bitmap et à cours de mémoire?
Les choses à surveiller que certains OOM n'est pas nécessairement causé par la page qui est le déclenchement de l'erreur. Parfois, le OOM est déclenchée par l'accumulation d'activités/bugs qui se déclencher par Bitmap manipulation par hasard. Nous devrions examiner l'application dans son ensemble au lieu de simplement la place qui a déclenché le OOM. Une récente DONC, la question que je viens de répondre a illustré ce scénario stackoverflow.com/questions/7136198/... où le OOM n'est pas nécessairement causée par l'Activité qui a déclenché l'erreur.
Il y a déjà beaucoup de réponses relatives à cette question, voici une solution qui devrait fonctionner pour vous. la Mémoire dépasse mise à JOUR: une Autre bonne réponse est ici, Fuites de Mémoire
Il y a déjà beaucoup de réponses relatives à cette question, voici une solution qui devrait fonctionner pour vous. la Mémoire dépasse mise à JOUR: une Autre bonne réponse est ici, Fuites de Mémoire
OriginalL'auteur Bob Keathley | 2011-09-03
Vous devez vous connecter pour publier un commentaire.
J'ai couru dans des problèmes de ce genre dans le passé. Android utilise Bitmap VM et il est très petit. Assurez-vous de jeter votre bitmap par bmp.recycler. Plus tard, des versions d'Android ont plus de Bitmap VM mais la version que j'ai eu affaire a une limite de 20 mo.
Les gens aussi c'est une routine pour des Tuiles de cache des images pour dessin sur une MapView. Je ne peut pas recycler les images ou le tirage au sort des routines sur la carte en panne.
OriginalL'auteur Kenny Lim
Cela peut fonctionner. Rétrécir les images de moindre qualité. Je ne suis pas sûr, mais cela peut dupliquer l'image dans la mémoire, mais pourrait facilement être vaut la peine d'essayer.
Mon ancienne réponse ci-dessous, je ne pense pas que travaillera en streaming.
OriginalL'auteur a54studio
Il semble que vous avez déjà fait un peu de lecture sur ce sujet, donc je vais vous épargner la norme, c'est une façon de décoder une image bitmap commentaires..
Il saute aux yeux que vous êtes peut-être maintenant sur une référence de vieilles images (peut-être que la dalle s'est déplacé hors de l'écran, mais vous avez toujours une référence dans un tableau quelque part, et comme un résultat, il n'est pas de ces ordures?). Cela a mordu m'a vraiment fait mal dans le passé - des fuites de mémoire sont difficiles à déboguer.
Il y a une grande Google I/O de la vidéo sur ici qui m'a vraiment aidé quand j'avais des problèmes similaires. Il est environ une heure, mais nous l'espérons vous sauver jours plus tard.
Il couvre des choses comme:
OriginalL'auteur Ben Pearson