我的应用中的Activites包含片段,片段又包含充满位图数据的listview / gridviews。最终用户将耗尽内存,因为先前活动及其片段的视图不会被破坏。因此,当用户达到第10个活动时 - 之前的9个活动会保留大量的位图数据。
我已经在使用弱反射了,但是MAT说一些片段的视图可以引用,例如,Gallery又可以保存适配器等。所以ImageViews保留了活着,位图也是如此。
到目前为止,我完全删除了碎片,移除了适配器。有时候它有效,但我想知道为什么这么复杂,如果有更简单的方法来免费/获取而没有太多编码?
UPD
我很感激开源应用程序的一个例子,其中相同的问题受到挑战。
UPD2
我的大多数活动的蓝图是:活动保持片段。片段保存充满了图像视图的AbslistView。
感谢。
答案 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提供了一些有关加载图片的重要信息。
如果您通过某种异步缓存加载程序加载所有图像,请根据需要清除onViewDestroyed
或onDetached
上的缓存,并且不要保留对应删除的那些位图的其他引用你的大多数问题。
生命周期非常对称(onCreate
<> onDestroy
,...)因此,最好将您在该生命周期部分的另一侧创建的任何引用置零。假设您在生命周期中使用了适当的位置,您可以免费获得大量内存管理。在您的情况下,您应该检查,如果您的片段被保留,您不会保留对Gallery
或ImageView
的引用(应仅存在于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();
}
它不是世界上最优雅的解决方案,但它应该有所帮助。