我有一个活动,用户可以从一个片段进展到另一个片段。片段启动,下载一些数据并显示它(以及从资源中绘制一些图标等)。用户可以根据自己的喜好继续向前移动片段(直到他们感到无聊?)。
问题是,最终会发生OutOfMemoryError(在32mb vm堆上大约90个片段之后)。 90看起来确实很多,但我在现场看到了这样的内存错误报告,所以这可能是在较低端设备上发生的。 我确保我在onCreateView中创建的任何视图都在onDestroyView中无效。我的片段所拥有的唯一其他对象(据我所知)是它在开始时下载的数据,通常只有10-50kb。
我的第一个问题是,这是正常的吗?我可以期望'只'能够在后栈中拥有~90个片段吗?或者我在某处可以做一些内存泄漏?
如果用户离开我的应用程序,并且Android决定终止整个进程以释放内存,那么当用户返回所使用的内存时,因为整个状态已从bundle恢复。如果用户然后反向通过后栈,则当然会从savedinstancestate创建/恢复每个片段。
所以我的第二个问题是,有没有办法强迫这种情况发生?即,'如果后面的堆栈中有> 50个片段,开始将底部的片段杀死到savedInstanceState?'
答案 0 :(得分:1)
所有后向堆栈片段都使用硬引用保存在内存中。因此,如果你在后面堆栈中保留了大量的碎片,那么你将会失去记忆。
看看这里:When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?
答案 1 :(得分:-6)
在AndroidManifest.xml
标记中的<Application>
中尝试此操作:
android:largeHeap="true"
并提供您的代码以提供更多帮助。