2011-04-13 5 views
4

Je crée un dessin à partir d'un flux http en procédant comme suit.Android Drawable.createFromStream alloué trop de mémoire

HttpClient client = new DefaultHttpClient(); 
    HttpGet get = new HttpGet(url); 

    HttpResponse response = client.execute(get); 

    InputStream is = response.getEntity().getContent(); 

    Drawable drawable = Drawable.createFromStream(is, "offers task"); 

    return drawable; 

Mon problème est que le Drawable.createFromStream alloue beaucoup plus de mémoire que prévu. L'image que j'essaye de télécharger est 13k, mais l'appel de createfromstream alloue un tampon de 16mb causant une erreur de mémoire insuffisante.

E/AndroidRuntime(8038): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=9066KB, Allocated=7325KB, Bitmap Size=16647KB) 

Est-ce que quelqu'un d'autre a rencontré ce problème?

+0

J'ai le même problème et je n'ai pas trouvé de solution. –

+0

Le problème que j'avais était en fait un problème avec le coup de tonnerre htc pas de déchets qui collectent quelque chose et puis finalement manquer de mémoire. Même avec l'appel de recycle() sur tous les bitmaps ne sont jamais libérés du tas natif. Le problème a été résolu avec une mise à jour du firmware. –

Répondre

1

La pratique courante du chargement d'images externes sur android consiste à échantillonner l'image en fonction de la taille de l'ImageView hôte.

étapes: 1, téléchargez l'image originale.

2, utilisez la méthode BitmapFactory.decodeFile (filePath, options) pour obtenir la largeur et la hauteur de l'image.

BitmapFactory.Options opt = new BitmapFactory.Options(); 
BitmapFactory.decodeFile(filePath, opt); 
int width = opt.outWidth; 
int height = opt.outHeight; 

3, faites vos calculs, séance d'entraînement d'un fichier sampleSize et Décodage:

opt = new BitmapFactory.Options(); 
opt.inSampleSize = theSampleSizeYouWant; 
img = BitmapFactory.decodeFile(filePath, opt) 

programmation pour Android est comme l'enfer. équipe Android ne semble pas comprendre ce que java est vraiment. les codes sentent comme MS C, dans lequel vous devez d'abord passer une structure pour obtenir sa taille, faire l'allocation de mémoire vous-même, le passer à nouveau et obtenir le résultat. Il y a pratiquement des milliers de petits pièges que vous devez payer des attentions supplémentaires pour afficher une image à partir du net. (ne pas oublier d'utiliser la méthode recyle() pour effacer la mémoire après qu'une image n'est plus nécessaire.) android gc sucks)

Questions connexes