Android hors de la prévention de la mémoire
J'ai une liste qui affiche les vignettes (petites images) téléchargées à la volée à partir du web.
À un certain point, le processus est à court de mémoire.
Comment puis-je savoir que la mémoire libre est sur le point de fuir, afin que je puisse arrêter de télécharger des images de plus?
Je voudrais savoir à l'avance afin de ne pas être sur le bord de manque de mémoire.
Note:
Ce n'est pas une fuite de mémoire, seulement beaucoup de téléchargé des images bitmap.
Grâce.
source d'informationauteur AlikElzin-kilaka
Vous devez vous connecter pour publier un commentaire.
1) Vous devez être votre propre navigateur.
Télécharger les pouces de la carte sd, plutôt que de les conserver dans la mémoire RAM. Réduction/faire pivoter avant de vous enregistrer, de sorte que la prochaine fois que vous devez charger la charge est "libre" de la carte sd au lieu de cher de les internets. (C'est à dire: à l'instar de n'importe quel navigateur, utiliser un cache de fichiers local).
Libération provisoire Bitmap objets que vous pouvez créer pour ce faire.
Apprendre à utiliser le "
inSampleSize
" param décompresser des Bitmaps à moins que la résolution d'origine.Si les fichiers que vous écrivez fin à une image de l'extension (.jpg, etc), ils apparaissent dans la Galerie, afin de ne pas enregistrer vos pouces avec une évidente image des noms de fichiers.
2) Créer un système à plusieurs niveaux (système de cache Bitmap > SDCard > Internets).
Lorsque vous déballez une vignette, l'enregistrer dans un SoftReference cache. Si vous avez besoin d'utiliser cette vignette, demandez-le à partir du cache. Si la VM besoin de plus de mémoire, votre SoftReference instance peut renvoyer null.
Si vous obtenez la valeur null à partir de votre cache bitmap, puis vérifiez si vous avez déjà mis votre url sur la carte SD et de les charger dans la mémoire cache des bitmaps à partir de là.
Si vous obtenez la valeur null à partir de votre système de fichiers, puis allez télécharger l'image à partir de l'internet et l'enregistrer sur carte sd et de le coller dans votre logiciel de cache.
3) de Libérer les ressources qui ne sont pas utilisés.
De la même façon, assurez-vous d'effacer les images de l'opinion qu'ils ont été placés dès que la Vue est hors de l'écran (si votre point de Vue en direct dans une liste ou d'un autre Adaptateur de base de l'élément, c'est essentiellement "libre" à partir de recyclage de l'Affichage des éléments) -- Toutefois, si vous avez ImageViews instancié avec les Bitmaps et ils ne sont pas immédiatement affiché sur l'écran, vous perdez probablement votre tas.
Vous pouvez simplement appeler
setImageBitmap(null);
sur une ImageView et la référence à l'image sera supprimée (de sorte que si la ref est la SoftReference quand il n'est pas utilisé).4) faites attention à ce fil que vous êtes dans.
Rappelez-vous, vous doit télécharger des images bitmap à partir d'un non-thread d'INTERFACE utilisateur (nous utilisons une instance de Service à agir comme une file d'attente de l'intention des demandes), et vous doit joindre les images bitmap en instance de Vue que dans le thread de l'INTERFACE utilisateur.
Vous aurez besoin de créer un bon système de file d'attente pour charger le tout dans votre cache bitmap hors le thread d'INTERFACE utilisateur et ensuite utiliser un Gestionnaire de dire à votre mémoire cache des bitmaps à remplir ImageViews sur le thread d'INTERFACE utilisateur.
5) faites attention à votre téléchargement de Files d'attente.
Si vous êtes comme nous et que vous avez les deux pouces et images en pleine taille, vous devez soit manuellement, utiliser une file d'attente de priorité pour placer votre image demandes avant de pouce demandes, ou utiliser deux Services différents (que mettre en file d'attente de leurs Intentions) pour télécharger les pouces vs plein d'images.
Sinon, vous risquez de faire la queue un écran de pouce de téléchargements, mais pas de répondre avec une image complète jusqu'à ce que, après que tous les pouces complet.
6) Demander au système de combien de RAM que vous avez.
7) "
onLowMemory()
" ne fait pas ce que vous attendez.C'est pour quand l'utilisateur est en cours d'exécution trop d'applications sur le téléphone et le système d'exploitation a besoin de récupérer de la mémoire physique à partir de toutes les applications en cours d'exécution.
Ce qui est totalement distincte de l'exécution de l'application VM tas comme vous pourrez le faire facilement par le chargement d'un trop grand nombre d'images.
Au meilleur de ma connaissance, vous n'obtiendrez pas un avertissement, il vous suffit de crash (tho vous pouvez suivre les informations contenues dans la mémoire avec l'appel ci-dessus).
Espoir qui aide à essayer de faire quelque chose d'intelligent sur le téléchargement et l'affichage des pouces de la internets.
mig
- Je utiliser SoftReference pour tenir les objets bitmap. La liste seulement les besoins actuels des images visibles. Donc, je n'ai jamais besoin de vous soucier de manquer d'espace.
Le moins, c'est que quand je vois les images, faites défiler vers le bas (à l'origine de certains SoftReferences pour effacer les Images), puis revenir à nouveau à la même place - les images sont téléchargées à nouveau 🙁
Aussi, le SoftReferences obtenir effacée très rapide. Je m'attends à économiser de l'intérieur bitmap plus.
Vous devez utiliser
inSampleSize
option deBitmapFactory.Options
lors de la création d'images.Aussi, certains conseils de Android: de mémoire d'exception dans la Galerie a été utile pour moi de garder un vérifier la quantité de mémoire disponible.
Vous pouvez contourner l'Activité
onLowMemory()
méthode pour le traitement personnalisé de tels scénarios