2011-10-27 3 views
0

Dans mon application, il est possible d'avoir une pile d'activités sans fin. Le scénario est que vous commencez sur la page d'un utilisateur qui a une liste de personnes qui sont des «amis» de cet utilisateur. Vous pouvez ensuite cliquer sur un ami pour aller sur sa page, qui ressemble à la précédente, où vous pouvez cliquer sur un autre ami pour accéder à sa page, et ainsi de suite ...Schéma d'activités sans fin

Le gros problème que je suis faire face est un tas indigène sans fin. Je crois que j'ajoute à ce tas chaque fois qu'une vue est gonflée. Après quelques itérations de cela, je reçois constamment des erreurs d'OOM, donc je dois trouver une sorte de solution. L'astuce est, je veux maintenir les dernières activités au minimum pour naviguer dans l'histoire. Le meilleur que je peux trouver est de surveiller la pile d'activité, puis commencer les activités de finition quand il atteint un certain point. Cela semble-t-il être une approche solide, ou même plus loin, quelqu'un peut-il me diriger vers une mise en œuvre de cette approche ou d'une autre approche?

Merci

modifier:

La pile est très simple. Cliquez sur un listrow (un ami), allez à leur page. Cela utilise un appel startActivity normal avec une intention sur la même page que vous êtes sur, et une intention supplémentaire avec l'ID utilisateur qui appellera alors la base de données ou un appel api distant pour obtenir les données de l'utilisateur. De plus, pour faire le suivi de Dalvik vs Native, je vérifie régulièrement la mémoire meminfo pendant ma navigation. Je garde le tas dalvik aussi petit que possible, nettoyant les ressources dans onStop. Le tas indigène se développe beaucoup plus vite. Je n'ai pas de références concrètes aux bitmaps, mais beaucoup d'éléments graphiques à l'écran à partir des inflations. Est-ce que ces drawables mèneraient à l'androïde qui tue mon activité finalement? Autant que je sache, ils mènent à l'OOM sans qu'aucune de mes activités ne soit détruite préventivement. Si je pouvais détruire manuellement mes activités au lieu de simplement les arrêter (comme Android prétend le faire quand il manque de mémoire), et conserver l'activité détruite sur la pile avec l'état sauvegardé, ce serait idéal.

modifier à nouveau:

une autre clé est que ces activités auront d'autres activités mélangées avec eux par exemple

utilisateur -> utilisateur -> activité a -> utilisateur -> activité b -> utilisateur

c'est pourquoi je veux utiliser le haut dans la pile, donc je sais quand je dois aller une activité de l'utilisateur et quand je ne le fais pas.

+0

comment exactement vous implémentez votre « pile » de pages de l'utilisateur? – josephus

Répondre

0

Je ne pense pas que le problème MOO que vous rencontrez est lié au nombre d'activités que vous avez ouvert. Android devrait détruire toutes les anciennes activités en arrière-plan que la pression de la mémoire augmente. Ces activités seront ensuite recréées lorsque l'utilisateur reviendra dans la pile de tâches.

Avez-vous utilisé un outil comme MAT (outil d'analyse de mémoire) pour examiner ce que vous avez alloué pendant l'exécution de votre application. Je soupçonne que vous pourriez avoir une fuite de mémoire, ou que vous deviez être plus intelligent dans vos allocations de mémoire. Que diriez-vous de faire cette activité singleInstance, intercepter KeyEvent.

+0

J'ai utilisé MAT et j'ai été très prudent en libérant des ressources onStop aussi. En regardant le vidage de meminfo alors que je navigue plus profondément, natif et dalvik montent. Le système va-t-il tuer une activité à cause d'un problème de tas natif? Je pensais que c'était séparé ... –

+0

Eh bien, je m'attendrais à ce que natif et dalvik montent jusqu'à ce qu'un GC soit exécuté. Si la majeure partie de votre mémoire est allouée au côté natif, je pense que vous avez raison de penser que Dalvik ne réagira pas à cela. On dirait que vous faites le plus de travail du côté autochtone. Etes-vous sûr que votre nettoyage fonctionne correctement, car onStop doit être appelé pour une activité lorsque vous passez au suivant dans la pile. –

+0

Mon nettoyage fonctionne, mais il n'est peut-être pas assez complet. J'efface les listes et répertorie les corbeilles pour me débarrasser des lignes, mais les autres vues sont intactes, ce qui signifie que tout ce qui est en dehors de ma liste conserve ses drawables (boutons, arrière-plans, images d'en-tête, etc.). Je soupçonne que c'est la raison pour laquelle le tas natif ne cesse de monter, chaque fois qu'il gonfle ces drawables, ils s'assoient juste là. Donc, de la façon dont je le vois, je dois soit arrêter toutes mes vues sans arrêt (ce qui semble être exagéré), soit réguler la taille de ma pile d'activité. Si je pouvais voir ce qui était dans mon tas d'origine, je serais plus confiant. –

1

KEYCODE_BACK, construire votre propre pile bouton de retour pour cette activité

j'ai fait quelques exemples ici:

http://esilo.pl/selvin/endlessactivity.zip

+0

une bonne idée (et un upvote pour cela), mais mes besoins sont un peu plus complexes. Quelque chose que j'ai négligé de mentionner est que ces activités auront d'autres activités mélangées avec eux, éditant ci-dessus pour refléter que –

+0

télécharger la nouvelle version (de la même source) ... j'ai oublié d'ajouter 'setIntent (intention);' dans 'public void onNewIntent (Intent intention) '(sans changement d'orientation, vous perdrez le backstack) – Selvin