如何避免OutofMemoryException?

时间:2012-08-29 14:10:34

标签: android memory

我的应用中的Activites包含片段,片段又包含充满位图数据的listview / gridviews。最终用户将耗尽内存,因为先前活动及其片段的视图不会被破坏。因此,当用户达到第10个活动时 - 之前的9个活动会保留大量的位图数据。

我已经在使用弱反射了,但是MAT说一些片段的视图可以引用,例如,Gallery又可以保存适配器等。所以ImageViews保留了活着,位图也是如此。

到目前为止,我完全删除了碎片,移除了适配器。有时候它有效,但我想知道为什么这么复杂,如果有更简单的方法来免费/获取而没有太多编码?

UPD

我很感激开源应用程序的一个例子,其中相同的问题受到挑战。

UPD2

我的大多数活动的蓝图是:活动保持片段。片段保存充满了图像视图的AbslistView。

感谢。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我建议您观看Memory management for Android apps Google IO 2011演示文稿。

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

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

答案 2 :(得分:1)

如果不耗尽所有内存,很难完成。

这需要按需(重新)加载,释放内存以查看视图破坏并仔细设计片段和类。

https://developer.android.com/training/displaying-bitmaps/index.html提供了一些有关加载图片的重要信息。

如果您通过某种异步缓存加载程序加载所有图像,请根据需要清除onViewDestroyedonDetached上的缓存,并且不要保留对应删除的那些位图的其他引用你的大多数问题。

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

答案 3 :(得分:0)

如果在适配器的getView方法中发生了outofmemoryexception,

你可以将它经常发生的线隔离开来并用这样的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();
}

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