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

OriginalL'auteur Bob Keathley | 2011-09-03