在我的应用程序中,我有2个列表活动,可以通过单击其项目来启动其中一个。
|--Activity1--| |--Activity2--| |--Activity1--|
| item11 | ->click-> | item21 | | item21 | ->click-> ...
| item12 | | item22 | ->click-> | item12 |
| item13 | | item23 | | item13 |
|-------------| |-------------| |-------------|
因此,如果用户点击太多,他可以填满所有堆栈,系统会抛出StackOverFlowException
不会吗?
我选择的解决方案是用noHistory="true"
标记这两个活动,但现在我很遗憾用户无法使用后退按钮在这两个活动之间导航。
有人可以帮我找到更好的选择吗?
提前致谢
编辑:为了更全面,让我们解释一下这个活动的工作流程目标:
我有一个数据库,用于存储链接到一年中的天数列表的名称列表。名称可以链接到多天,每天同样的事情可以链接到多个名称。
the database schema
| names |---< n, m >---| days |
因此,此活动工作流程是一种数据库导航器:
Activity1
是NameListActivity
,它会显示与特定日期相关联的名称列表。 Activity2
是DateListActivity
,它会显示与特定名称相关联的天数列表。当用户点击NameListActivity
的项目(名称)时,DateListActivity
会以链接到所点击名称的天数列表开始。
同样,当用户点击DateListActivity
的项目(日)时,NameListActivity
将以链接到所点击日期的列表名称开始。
答案 0 :(得分:6)
因此,如果用户点击太多,他就可以 填写所有堆栈,系统将 抛出一个StackOverFlowException不是 它?
不,它不会。
答案 1 :(得分:1)
我不明白为什么从Activity2中移除Activity1的能力会降低用户体验。我相信当你导航这种类型的菜单时,你会在心里创建一个层次上的列表,所以当点击item22时,如果我被送回Activity1,我会感到困惑。
我需要有关菜单内容的更多详细信息以建议其他设计,但您可能最好重新考虑菜单系统。
答案 2 :(得分:1)
据我了解,Android的“堆栈”活动并不是传统意义上的“堆栈”,而是以更智能的方式管理内存。活动堆栈实际上在堆上,如果需要,操作系统将终止堆栈中较低的活动。
我想说最糟糕的事情就是你失去了一段古老的历史。
如果要测试它,请在每个活动中分配大量内存,以便5或6将填充可用内存,然后尝试。
答案 3 :(得分:1)
commonsware是正确的。您不必担心堆栈溢出。 :)但是,您可以设计应用程序以清除堆栈以避免您描述的情况。查看Clearing the Stack,特别是使用clear top。
答案 4 :(得分:0)
您需要做的是将历史存储在某种结构中,而不是依靠堆栈来为您维护它。然后,您可以保持良好的用户体验,而不是吹嘘。
答案 5 :(得分:0)
尝试删除此noHistory =“true”,而是将android:launchMode =“singleTask” http://developer.android.com/guide/topics/manifest/activity-element.html#lmode 但Mark @commonsware你会很好。
答案 6 :(得分:0)
我的申请遇到了类似的问题。 似乎问题在于每个活动的嵌套视图的数量。所以,如果你有,例如:
tab->
linear layout->
text,
linear layout->
text,
scroll->
text,
linear layout->
image,
text
并且可能还有几个嵌套,从这样的视图到类似视图并且返回几次(根据我的经验),你获得堆栈溢出的几率很高。使用hierarchyviewer(android-sdk / tools)检查嵌套。还告诉我你是否解决了这个问题,因为我还是不知道如何修复它......