0

我的应用程序中的活动包含片段,这些片段又包含充满位图数据的列表视图/网格视图。最终用户将耗尽内存,因为先前活动的视图及其片段没有被破坏。因此,当用户达到第 10 个活动时 - 前 9 个活动持有大量位图数据。

我已经在使用弱引用,但是 MAT 说某些片段的视图包含对例如 Gallery 的引用,而 Gallery 又包含适配器等。因此 ImageViews 保持活动状态,位图也是如此。

到目前为止,我已经尝试过完全移除片段、移除适配器。有时它有效,但我想知道为什么这会如此复杂,是否有任何更简单的方法可以在没有太多编码的情况下释放/获取?

UPD

我会欣赏一个挑战相同问题的开源应用程序示例。

UPD2

我的大部分活动的蓝图是:活动持有片段。片段包含充满图像视图的 AbslistView。

谢谢。

4

4 回答 4

1

我建议只保留你需要的内存并销毁其他所有内容。用完所有可用内存是不好的形式。我会查看活动生命周期并完全理解它以解决您的问题: https ://developer.android.com/reference/android/app/Activity.html

于 2012-08-29T14:14:53.363 回答
1

我建议观看Android 应用程序的内存管理Google IO 2011 演示文稿。

您还应该检查应用程序的工作流程,以确定何时可以开始销毁旧活动或释放其他资源。

您还可以使用ActivityManager.getProcessMemoryInfo()来检索进程的内存使用信息,以帮助确定是否需要释放一些旧资源。

于 2012-08-29T14:17:44.593 回答
1

如果不使用所有内存,很难完成它。

这需要按需(重新)加载、在视图销毁时释放内存以及仔细设计片段和类。

https://developer.android.com/training/displaying-bitmaps/index.html有一些关于以这种方式加载图像的有价值的信息。

如果您通过某种异步缓存加载器加载所有图像,请根据您的需要onViewDestroyedonDetached根据您的需要清除缓存,并且不要保留对这些位图的其他引用,您应该已经消除了大部分问题。

生命周期非常对称(onCreate<> onDestroy,...),因此最好将您在该生命周期部分的另一侧创建的任何引用清空。假设您在生命周期中使用适当的位置,您将免费获得大量内存管理。在您的情况下,您应该检查如果您的片段被保留,您不会保留对Galleryor ImageViews 的引用(应该只存在于onCreateView->之间onDestroyView

于 2012-08-29T14:28:32.933 回答
0

如果您的内存不足异常发生在适配器的 getView 方法中,

您可以隔离它通常发生的行,并用这样的 try-catch 包围它:

try {
   // load image (or whatever your loadimage is)
    mViewHolder.thumbImage.loadImage();
} catch (OutOfMemoryError e) {
   // clear your image cache here if you have one
   // call gc
   System.gc();
   // load image retry
   mViewHolder.thumbImage.loadImage();
}

它不是世界上最优雅的解决方案,但它应该有所帮助。

于 2012-08-29T14:29:02.357 回答