Comment faire pour vider ou effacer un segment de mémoire de façon dynamique dans mon code
Dans mon application que je suis en utilisant une simple galerie et le coverflow à la fois
j'ai mon coverflow galerie d'image sur l'image cliqué dans coverflow je suis redirigé vers la prochaine activité que le contenu en plein écran de la galerie et je peux même faire défiler ma galerie en plein écran ;
mais quand j'ai mis plus de montant de de l'image ou les images à haute résolution dans mon application il se force fermée en raison de la taille du Bitmap dépasse VM budget
donc je veux effacer la mémoire du tas à chaque fois que je fini ma couverture de flux et de la galerie donc je peut charger n'importe quel montant ou toute résolution de l'image dans mon application
donc si quelqu'un peut m'aider ...
Comment effacer/vider la mémoire du tas à chaque fois quand j'ai fini mon activité de façon dynamique dans mon code?
j'ai déjà essayé de recyclage et de Système.gc méthode
- Vous pouvez lire regarder ce romain guy dit à propos de graphiques et d'images.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas effacer le tas". la VM va le faire automatiquement lors de vos objets ne sont plus référencés.
Cela étant dit, les bitmaps sont une chose difficile dans android. Il y a peu de mémoire, et lorsqu'une image est décodée dans une image, il peut prendre beaucoup plus de mémoire que la compression de l'image format de lui-même.
Il n'y a pas de réponse simple à votre solution. Même si vous faites tout correctement, vous pouvez tout simplement être à court de mémoire. Cela étant dit, voici quelques conseils:
Utilisation
Bitmap.release()
. les bitmaps sont particulières en ce qu'elles sont alloués sur la pile native (par opposition à VM) tas. La documentation javadoc sont un peu floue, en disant que vous n'avez normalement pas besoin de l'appeler, mais dans mon expérience, cette "idée" à la machine virtuelle que vous avez terminé avec la mémoire de sauvegarde de l'image est important. EDIT: Comme d'Android 3.0 (API de niveau 11), le pixel de données est stockée sur le Dalvik tas avec le bitmap associés.Charger des images bitmap en mémoire échelle. Voici un post de blog sur le sujet. Vous obtenez seulement 24 MO tas sur certains appareils et une haute résolution d'image pourrait épuiser tous que quand il est chargé dans un objet bitmap. Il n'y a pas moyen de contourner cela, vous devez le charger à l'échelle.
Ne pas appeler
System.gc()
comme une autre réponse dit. Les gens qui ont construit l'algorithme de GC sont plus intelligents que vous et moi; ils savent ce qu'ils font. Vous n'obtiendrez jamais un OOME quand il y a une mémoire qui peut être libérée par un GC - GC sera toujours courir avant de vous donner un OOME.Celle-ci est évidente, mais assurez-vous que vous ne possédez pas de références à des bitmaps quand ils ne sont pas nécessaire, pas plus.
Enfin, et ce suce, Android n'est pas faire de tas de compactage. Voici un DONC, la question j'ai posté à ce sujet il y a quelques temps, avec pas de réponse satisfaisante. En un mot, Android jamais compacte le tas, de sorte que votre application garde une allocation de gros, ou même de taille moyenne, des morceaux pour les images bitmap, vous en viendrez dans une situation où, alors que vous ne sont pas de mémoire, il n'y a pas assez grand espace contigu de mémoire pour votre allocation, et vous obtenez OOME. Le seulement moyen de contourner cela, comme je l'ai écrit dans ma question, est de tuer l'application du processus lorsque l'utilisateur quitte. Cela rend le démarrage plus lent que la prochaine fois, mais elle garantit un tout nouveau segment de mémoire. Ne vous méprenez pas, je ne peux pas croire que c'est la bonne chose à faire, mais personne n'a trouvé une meilleure solution.