2017-09-05 2 views
-6

je suis nouveau à la programmation android je suis confronté à un problème dans le chargement des bitmaps j'ai près de 92 bitmaps dont j'ai besoin de charger. mais l'application se bloque après 9 ou 10 bitmaps .. bien voulu me aider iciMon application se bloque quand je charge énormément de bitmaps dans arraylist

est l'erreur Lancer OutOfMemoryError « Impossible d'allouer une allocation 22.050.012 d'octets avec 1805056 octets libres et 1762KB jusqu'à OOM » 09-05 19:49: 36,188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia: --- allocation a échoué pour bitmap à l'échelle

mPages = new ArrayList<Bitmap>(); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p1)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p2)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p3)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p4)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p5)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p6)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p7)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p8)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p9)); 
+0

Utilisez LogCat pour examiner la trace de la pile Java associée à votre crash: https://stackoverflow.com/questions/23353173/unheureusement-myapp-has-stopped-how-can -i-solve-this. – CommonsWare

+0

Throwing OutOfMemoryError "Impossible d'allouer une allocation 22050012 octets avec 1805056 octets libres et 1762 Ko jusqu'à ce que MOO" 09-05 19: 49: 36.188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia: --- allocation a échoué pour Bitmap mis à l'échelle @CommonsWare –

+1

Je dirais que vous vous y prenez dans le mauvais sens. Stocker des bitmaps gonflés dans un tableau va utiliser une tonne de mémoire inutilement. Pourquoi ne pas simplement conserver un tableau ou une liste d'ID de ressource et gonfler uniquement si nécessaire, c'est-à-dire dans l'adaptateur de RecyclerView? –

Répondre

2

Si toutes vos images ont la même taille, vous essayez d'allouer ~ 2028601104 bytes = ~ 1981055KB = ~ 1934MB. Vous disposez de 64 Mo ou moins sur la plupart des appareils Android que votre application peut utiliser. L'image sur laquelle vous avez échoué est de 220 50012 octets, décodée et éventuellement mise à l'échelle. Cela équivaut à 2347 x 2347 pixels. Peu d'appareils Android ont des écrans de cette résolution.

Donc, vous devez faire plusieurs choses:

  1. Arrêtez d'essayer de charger avant tous les bitmaps. Chargez-les au besoin.

  2. Réduit la résolution des bitmaps. Si vous placez les bitmaps dans un répertoire autre que res/drawable-nodpi/, déplacez-les sur res/drawable-nodpi/. Par exemple, si vous les mettez dans res/drawable/, c'est un synonyme de res/drawable-mdpi/, indiquant que les images sont conçues pour les périphériques mdpi (~ 160dpi). Android met automatiquement ces images à l'échelle pour les appareils de plus haute densité. Si vous avez des images volumineuses, vous ne pouvez pas permettre à Android d'effectuer ce type de mise à l'échelle. res/drawable-nodpi/ indique à Android que ces images ne sont pas liées à une densité particulière et ne devraient donc pas être mises à l'échelle de cette façon.

Vous pourriez également vouloir reconsidérer tout ce plan. Travailler avec beaucoup de bitmaps — et encore moins les grands — est compliqué même pour les développeurs d'applications Android expérimentés. La gestion de la mémoire est difficile. Si vous êtes nouveau sur Android, vous devriez peut-être envisager un projet qui sera plus simple à mettre en œuvre.

+0

merci problème est résolu. –

0

Vous êtes hors de la mémoire. Vos bitmaps sont trop volumineux pour être stockés dans le tableau.

+1

La quantité de mémoire dans l'émulateur est vide de sens dans ce cas. L'OP tente d'allouer ~ 2 Go, et la limite de tas par processus sera beaucoup moins que cela. – CommonsWare

+0

Et il y en a 92. Je sors sur une branche et devine qu'ils sont tous de la même taille. – CommonsWare

0
  1. Si vous avez juste besoin de voir les photos, vous pouvez utiliser RecyclerView. Il garde en mémoire seulement quelques photos qui sont sur l'écran maintenant, et libère des photos qui ont été défilées hors de l'écran.

  2. À d'autres fins, vous pouvez enregistrer toutes les photos sur la carte SD.

Pour les deux cas 1 & 2 utilisation de la bibliothèque spéciale (Glide, Picasso, ...). Les bibliothèques sont faciles à utiliser, elles peuvent automatiquement mettre en cache les images téléchargées sur la carte SD et avoir de nombreux autres avantages.Recherchez "glide with recyclerview" (par exemple)