Android 无止境活动计划

Android 无止境活动计划,android,memory,android-activity,native,lifecycle,Android,Memory,Android Activity,Native,Lifecycle,在我的应用程序中,有一个无休止的活动堆栈。场景是,您从一个用户的页面开始,该页面包含该用户的“朋友”列表。然后你可以点击一个朋友进入他们的页面,看起来就像上一个一样,然后你可以点击另一个朋友进入他们的页面,依此类推 我面临的最大问题是无休止的本地堆。我相信每次视图膨胀时,我都会添加到这个堆中。经过几次迭代,我不断地得到OOM错误,所以我必须找到某种解决方案。诀窍是,我想至少保持最后几项活动,以便浏览一些历史记录 我能想到的最好办法是监视活动堆栈,然后在达到某个点时开始完成活动。这听起来像是一个可

在我的应用程序中,有一个无休止的活动堆栈。场景是,您从一个用户的页面开始,该页面包含该用户的“朋友”列表。然后你可以点击一个朋友进入他们的页面,看起来就像上一个一样,然后你可以点击另一个朋友进入他们的页面,依此类推

我面临的最大问题是无休止的本地堆。我相信每次视图膨胀时,我都会添加到这个堆中。经过几次迭代,我不断地得到OOM错误,所以我必须找到某种解决方案。诀窍是,我想至少保持最后几项活动,以便浏览一些历史记录

我能想到的最好办法是监视活动堆栈,然后在达到某个点时开始完成活动。这听起来像是一个可靠的方法吗,或者更进一步,有人能告诉我该方法或其他方法的实现吗

谢谢

编辑:

堆栈非常简单。单击列表行(朋友),转到他们的页面。这是使用一个普通的startActivity调用,该调用的目的是指向您所在的同一页面,以及一个带有用户id的额外目的,该用户id随后将调用数据库或远程api调用以获取用户数据

此外,为了跟进Dalvik vs Native的情况,我在导航过程中会定期检查meminfo转储。我将使dalvik堆尽可能小,清理onStop中的资源。本机堆增长得更快。我在任何地方都没有对位图的硬引用,但屏幕上有相当多的可绘制图片是由于通货膨胀造成的。这些Drawable会最终导致android扼杀我的活动吗?就我所知,它们只是导致OOM,而不会对我的任何活动造成预防性破坏

如果我可以手动销毁我的活动,而不是仅仅停止它们(就像Android在内存不足时声称的那样),并将销毁的活动保留在堆栈上,状态保存,那将是理想的

再次编辑:

另一个关键是,这些活动将有其他活动与之混合,例如:

用户->用户->活动a->用户->活动b->用户


这就是为什么我想使用内置堆栈,这样我就知道什么时候我必须去用户活动,什么时候我不去。我不认为你遇到的OOM问题与你打开的活动数量有关。随着内存压力的增加,Android应该会在后台销毁所有旧的活动。当用户通过任务堆栈返回时,这些活动将被重新创建


您是否使用了MAT(内存分析器工具)之类的工具来检查在应用程序运行时分配的内容。我怀疑您可能有内存泄漏,或者您可能必须在内存分配方面更加智能

让此活动
singleInstance
,截取KeyEvent.KEYCODE\u返回,为此活动构建自己的返回按钮堆栈如何

我在这里举了一些例子:


你到底是如何实现你的用户页面“堆栈”的?我已经使用了MAT,并且在发布顶部资源时也非常小心。当我深入浏览meminfo转储时,native和dalvik都上升了。系统是否也会因为本机堆问题而终止活动?我认为这是分开的…我希望native和dalvik在GC运行之前都会上升。如果您的大部分内存都分配到本机端,我认为您的假设是正确的,即Dalvik不会对此做出反应。听起来你的大部分工作都是在本土完成的。你确定你的清理工作正常吗?因为当你移动到堆栈中的下一个活动时,应该为活动调用onStop。我的清理工作正常,但可能不够彻底。我清除了列表和列表回收站以清除行,但其他视图保持不变,这意味着列表之外的所有内容都保留其可绘制内容(按钮、背景、标题图像等)。我怀疑这就是为什么本地堆一直在上升,每次它膨胀这些可抽取的东西,他们就坐在那里。因此,在我看来,我要么必须在顶部删除所有视图(这似乎有些过分),要么调整活动堆栈的大小。如果我能看到我的原生堆中有什么,我会更有信心。是的,如果你在你的问题中发布更多关于你在Dalvik与原生堆中所做的事情,可能会对其他人更有帮助,因为NDK确实超出了我的专业知识范围。我知道你不应该尝试在活动之间保留可拖动项,除非你非常小心如何将它们从活动中解除绑定。请参阅android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html讨论这个问题。这是一个好主意(并对此进行投票),但我的需求要复杂一些。我忽略了提到的一点是,这些活动将有其他活动与之混合,编辑上面的内容以反映下载新版本(来自同一来源)。。。我忘记添加
setIntent(intent)
public void onNewIntent(意图)
(如果你改变方向,你将失去后退)