Dépassement de mémoire lors du chargement de la grande Image de Fond
Je suis en utilisant android:background
de donner une image d'arrière-plan pour android mise en page.
Après de mettre quelques images que je reçois cette exception :
08-24 00:40:19.237: E/dalvikvm-heap(8533): Out of memory on a 36000016-byte allocation.
comment puis-je utiliser les images de grande taille comme arrière-plan sur android?
puis-je augmenter la demande de segment de mémoire? ou est-ce quelque chose de pas bon de le faire ?
Comme il est mentionné dans beaucoup de ces questions, n'utilisez pas énorme (> 30 MO dans votre cas), images d'arrière-plan.
Il y a beaucoup de semblable à ce genre de questions dans le StackOverFlow. J'ai essayé de faire un résumé de nombreuses alternatives pour résoudre ce problème: stackoverflow.com/questions/11820266/...
en dehors de pas à l'aide d'une très grande image, doit prendre en compte les capacités des appareils, le vrai problème, c'est que l'appareil n'a pas la capacité de charge de fond que l'image énorme.
30MB n'est pas seulement une image, et merci @PauloCheque
J'ai dit "après de mettre quelques images" donc ce n'est pas seulement une image. et pas besoin de vote
Il y a beaucoup de semblable à ce genre de questions dans le StackOverFlow. J'ai essayé de faire un résumé de nombreuses alternatives pour résoudre ce problème: stackoverflow.com/questions/11820266/...
en dehors de pas à l'aide d'une très grande image, doit prendre en compte les capacités des appareils, le vrai problème, c'est que l'appareil n'a pas la capacité de charge de fond que l'image énorme.
30MB n'est pas seulement une image, et merci @PauloCheque
J'ai dit "après de mettre quelques images" donc ce n'est pas seulement une image. et pas besoin de vote
OriginalL'auteur Evan Lévesque | 2013-08-23
Vous devez vous connecter pour publier un commentaire.
Veuillez jeter un oeil à mon liés à la question:
L'Image en haute résolution - OutOfMemoryError
Essayer de minimiser l'utilisation de la mémoire de votre application en gardant l'image d'arrière-plan aussi petite que possible.
Cela peut se faire via:
Assurez-vous que les images que vous avez défini comme un arrière-plan sont chargés correctement (par exemple, coupées en taille, par exemple de l'adapter à la taille de l'écran) et libéré de la mémoire dès qu'ils ne sont plus nécessaires.
Assurez-vous d'avoir une seule instance de votre image dans la mémoire. Après l'affichage, appel
recycle()
et de définir votre référence à null.C'est comment vous pouvez charger vos images:
Grâce à Adam Stelmaszczyk pour ce beau morceau de code.
OriginalL'auteur Philipp Jahoda
J'ai connu un problème similaire en raison des images de fond dans les mises en page. La taille normale d'une allocation de mémoire d'une image doit être à la hauteur*largeur*4 octets (en mode ARGB_8888, le mode par défaut).
Si vous le voyez et l'allocation de 30 MO lors de l'affichage d'une activité, il doit y avoir un problème. Vérifiez si vous placez vos images d'arrière-plan dans le dossier drawable. Dans ce cas, le système doit évoluer l'image de la densité spécifique de l'écran, provoquant une grosse surcharge de la mémoire.
Solutions:
Plus d'informations à ce réponse
Espère que cette aide.
OriginalL'auteur Martillador81
J'ai eu le même problème et qu'il est corrigé par le texte suivant:
Créer un drawable-nodpi dossier et de mettre vos images d'arrière-plan.
Utilisation Picasso pour afficher les images http://square.github.io/picasso/
Les afficher avec .ajustement() et .centerCrop() et Picasso l'échelle de l'image si elle a besoin de
Si vous n'avez plus de mémoire en quelque sorte, Picasso ne sera tout simplement pas afficher l'image, au lieu de vous donner un OOM erreur. J'Espère que cela aide!
OriginalL'auteur Nickmccomb
Oui, vous le pouvez. Juste mettre
android:largeHeap:="true"
dans votre Manifest.xml.Pour moi, cette fonction a résolu une question dans un fragment de carte (ce qui montre jusqu'à 30k geo marqueur)... Et oui, c'est clair, que chaque appareil dispose d'une mémoire vive limitée - donc, nous devrions produire du code qui consomme le plus bas de ressources possible (parfois il vaut mieux mettre des données en cache, parfois, il est plus recommandé de faire usage de la cpu). À ce stade, personne ne peut donner une réponse courte. Mais comme je l'ai dit, cet extrait de code ci-dessus a fait l'affaire pour moi dans certaines circonstances.. il est donc faux de dire "cela ne fonctionne pas".
Je ne suis pas d'accord. Je crois qu'une solution ne doit pas ralentir votre application et d'introduire plus de problèmes sur la route. L'application ne fonctionne pas parce qu'il fait mauvais usage d'images, ce qui provoque une erreur De Mémoire insuffisante. Votre "solution" serait pas résoudre ce problème parce que, même si l'image est sous la taille de la mémoire disponible avec votre correction (ce qui pourrait ne pas l'être), une fois de plus, des bitmaps, il sera certainement l'être, et le OOM erreur se produira. Ce n'est pas une solution.
Seulement il y a une minute, j'ai eu un problème de mémoire lors du chargement d'une grande image dans une application-intro. Sur le Nexus 6p (périphérique réel) il n'y a pas de problème, mais genymotion a été s'écraser en raison de la mémoire. après la modification du paramètre dans le manifeste de l'émulateur fonctionne stable comme il se doit. Hehe, c'est juste ce qui m'est arrivé. Peut-être que vous devriez donner ce truc a essayer la prochaine fois 🙂
Voici ce que logcat dit: Processus: com.pepperonas.m104, PID: 21668 java.lang.OutOfMemoryError: Impossible d'allouer un 32778252 allocation d'octets avec 15391484 octets libres et 14MO jusqu'OOM à dalvik.système.VMRuntime.newNonMovableArray(Native method)
OriginalL'auteur Martin Pfeffer
Utiliser Glide qui vous aidera à mettre les images en cache et les charger à partir de la mémoire
D'autre part avec la Glisse, vous pouvez mettre en pause et de reprendre la demande en observant le comportement de défilement à l'aide de la
OnScrollChangedListener
OriginalL'auteur Vincent Mungai
Pour bitmap Glide est le meilleur .
OriginalL'auteur zubair shahzad