2010-01-08 5 views
1

Dans mon application, j'ai 2 activités de liste qui peuvent démarrer l'une ou l'autre en cliquant sur leurs articles.Dilemna: empêche StackOverflowException ou améliore l'expérience utilisateur?

|--Activity1--|   |--Activity2--|   |--Activity1--| 
| item11 | ->click-> | item21 |   | item21 | ->click-> ... 
| item12 |   | item22 | ->click-> | item12 | 
| item13 |   | item23 |   | item13 | 
|-------------|   |-------------|   |-------------| 

Donc, si l'utilisateur clique trop, il peut remplir toute la pile et le système lancera une StackOverFlowException non?

La solution que j'ai choisie était de marquer ces 2 activités avec noHistory="true", mais maintenant je regrette que l'utilisateur ne puisse pas naviguer entre ces 2 activités avec le bouton de retour.

Quelqu'un peut-il m'aider à trouver une meilleure alternative?

Merci à l'avance

EDIT: pour être plus complet, nous allons expliquer ce qui est de cette activité objectif de workflow:

J'ai une base de données qui stocke une liste de noms liés à une liste des jours dans une année. Un nom peut être lié à plusieurs jours, et la même chose un jour peut être lié à plusieurs noms.

the database schema 

| names |---< n, m >---| days | 

Donc, ce flux d'activité est une sorte de navigateur de base de données:

  • Activity1 est le NameListActivity, il affiche une liste de noms liés à un jour précis.
  • Activity2 est le DateListActivity, il affiche une liste de jours liés à un nom spécifique.

Lorsque l'utilisateur clique sur un élément (un nom ) du NameListActivity, le DateListActivity est démarré avec la liste des jours liés au nom cliqué.
Et même chose, lorsque l'utilisateur clique sur un élément (un jour) du DateListActivity, le NameListActivity est démarré avec la liste des noms associés au jour cliqué.

+1

Je pense que vous devriez aller avec la réponse de commonsware. Vous pourriez probablement causer un débordement de pile à moins qu'Android ne nettoie l'historique, mais si cela nécessite des milliers de clics, alors ce n'est pas un problème. –

Répondre

5

Donc, si l'utilisateur clique trop, il peut remplir toute la pile et le système jeter un StackOverflowException n'est pas il?

Non, ce ne sera pas le cas.

+0

Ok, je me trompe probablement comment fonctionne la pile, vous dites que même si l'utilisateur fait ('NameListActivity' ->' DateListActivity' -> 'NameListActivity' ->' DateListActivity' -> ...) mille fois, la pile ne déborde pas? Est-ce parce que c'est les mêmes activités? Pouvez-vous expliquer un peu plus s'il vous plaît. Thx à l'avance – tbruyelle

+1

Si le système d'exploitation pense qu'il a besoin de mémoire, il tue les activités qui, selon lui, doivent être détruites. Je pense que c'est expliqué en détail sur l'une des premières vidéos. Doit être sur youtube google channel –

+1

Vous semblez supposer que les activités vont sur la pile. Ils ne le font pas. Ils vont sur le tas. Aucun espace de pile supplémentaire n'est consommé par activité. – CommonsWare

1

Je ne vois pas pourquoi la suppression de la possibilité de passer à l'activité 1 de l'activité 2 détériorerait l'expérience de l'utilisateur. Je crois que vous créez mentalement une liste hiérarchique dans votre tête lorsque vous naviguez dans ce type de menus, donc en cliquant sur item22, je serais confus si on me renvoyait à Activity1.

J'ai besoin de plus de détails sur le contenu des menus pour suggérer un autre design, mais il vaut mieux repenser le système de menus.

+0

Ok, j'ai édité ma question – tbruyelle

0

Ce que vous devez faire est de stocker l'historique dans une structure, plutôt que de compter sur la pile pour le conserver pour vous. Ensuite, vous pouvez maintenir votre bonne expérience utilisateur et ne pas souffler la pile.

+0

Wow cela implique également d'attraper le bouton arrière cliquez sur ... – tbruyelle

0

J'ai des problèmes similaires avec mon application. Il semble que le problème réside dans le nombre de vues imbriquées pour chaque activité. Donc, si vous avez, par exemple:

tab-> 
    linear layout-> 
     text, 
     linear layout-> 
      text, 
      scroll-> 
        text, 
        linear layout-> 
         image, 
         text 

et peut-être plusieurs autres imbrications, les chances que vous obtiendrez un débordement de pile après avoir obtenu de ce point de vue d'un semblable et à plusieurs reprises (dans mon expérience) sont haute. Vérifiez l'imbrication avec hierarchyviewer (android-sdk/tools). Dites-moi aussi si vous résolvez le problème, parce que je ne sais toujours pas comment le résoudre ...

+0

Ceci * est * un endroit où vous pouvez obtenir une exception StackOverflowException, mais tout cela dans une activité. La question se rapporte à avoir plus d'une activité. – CommonsWare

1

Si je comprends bien, la «pile» d'activités d'Android n'est pas une «pile» dans le sens traditionnel, et la mémoire est gérée de manière plus intelligente. La pile des activités va en fait sur le tas, et le système d'exploitation va tuer les activités plus bas sur la pile s'il le faut.

Je dirais que le pire, c'est que vous perdez un peu d'histoire ancienne. Si vous voulez le tester, allouez une grande quantité de mémoire dans chaque activité pour que 5 ou 6 remplisse la mémoire disponible, puis essayez-le.

1

commonsware est correct. Vous n'aurez pas à vous inquiéter d'un débordement de pile. :) Cependant, vous pouvez concevoir l'application pour effacer la pile pour éviter la situation que vous avez décrite. Regardez dans Clearing the Stack, en particulier l'utilisation de clear top.

Questions connexes