在我的应用程序中,有能力拥有无尽的活动堆栈。场景是您从一个用户的页面开始,该页面包含该用户的“朋友”的人员列表。然后你可以点击一个朋友去他们的页面,看起来就像上一个页面,然后你可以点击另一个朋友去他们的页面,依此类推......
我面临的一个大问题是无尽的原生堆。我相信每次视图膨胀时我都会添加到这个堆中。经过几次迭代后,我一直都会遇到OOM错误,所以我必须找到某种解决方案。诀窍是,我想保持最后几个活动,以便导航一些历史。
我能想出的最好的方法是监控活动堆栈,然后在达到某个点时开始完成活动。这听起来像是一个可靠的方法,还是更进一步,任何人都可以指出我对该方法或其他方法的实现?
由于
编辑:
堆栈非常简单。点击listrow(朋友),转到他们的页面。这是使用正常的startActivity调用,意图使用您所在的同一页面,并使用用户ID的额外intent,然后调用数据库或远程api调用以获取用户的数据。
另外,为了跟进Dalvik vs Native,我在导航过程中经常检查meminfo转储。我保持dalvik堆尽可能小,清理onStop中的资源。本机堆增长得更快。我在任何地方都没有对位图的硬性引用,但屏幕上有很多可用的通道。这些drawables会导致android最终杀死我的活动吗?最好的我可以告诉他们只是导致OOM,而我的任何活动都没有被预防性地销毁。
如果我可以手动销毁我的活动而不是仅停止它们(就像Android声称在内存不足时那样做),并且在保存状态的情况下将被破坏的活动保留在堆栈上,这将是理想的。
再次编辑:
另一个关键是这些活动会将其他活动混入其中,例如
用户 - >用户 - >活动a - >用户 - >活动b - >用户
这就是为什么我想要使用内置堆栈,所以我知道什么时候我必须去用户活动,什么时候不去。
答案 0 :(得分:1)
如何进行此活动singleInstance
,拦截KeyEvent.KEYCODE_BACK,为此活动构建自己的后退按钮堆栈
我在这里做了一些例子:
答案 1 :(得分:0)
我认为您遇到的OOM问题与您打开的活动数量无关。随着内存压力的增加,Android应该在后台销毁任何旧活动。然后,当用户通过任务堆栈返回时,将重新创建这些活动。
您是否使用了MAT(内存分析器工具)等工具来检查在应用程序运行时分配的内容。我怀疑你可能有内存泄漏,或者你的内存分配可能需要更聪明。