5

首先,我知道有很多相关的帖子,我读过很多,没有一个有帮助,我没有想法:)

所以我正在开发一个使用大量图像(用于按钮、徽标、显示大量图像等)的 android 应用程序(sdk 版本 14+)。平均图像大小为 120kb +- 100kb

正如标题所说,我遇到了 OutOfMemory 错误。起初,我在 xml 中或以编程方式使用 setImageResource 将图像源添加到 ImageViews。由于 OutOfMemory 错误,很快应用程序开始崩溃。所以我已经阅读了这个(http://developer.android.com/reference/android/util/LruCache.html)教程并按照它所说的那样实现了LruCache。我将位图添加到 lrucache,然后使用 get 方法将位图设置为 imageview。

在活动的 onDestroy 方法中,我在 lrucache 上调用 evictAll 方法并将 lrucache 设置为 null。所以我想,然后内存就被释放了。

但是问题仍然存在,当我进行几个活动时,应用程序崩溃了。

非常感谢帮助:)

4

3 回答 3

4

谢谢你们帮了我很多!

因此,如果有人以同样的问题冲浪到这个问题,这里有一些指导方针:

  • 当您不再需要位图时,请在位图上调用 .recycle()。
  • 使用 Eclipse Memory Analyzer 找出你的问题
  • (必须)看这个视频
  • 这是从 .hprof 文件中查看位图的方法
于 2013-03-25T08:09:37.000 回答
3

根据文档,超过最大可用 VM 内存将引发 OutOfMemory 异常。似乎缓存位图超出了可用的虚拟内存。

不使用时回收位图。

 bitmap.recycle();

何时应该使用 LRUCache 回收位图?. 查看 commonsware 接受的答案。

我相信当 LRUCache 驱逐一个图像为另一个图像腾出空间时,内存没有被释放。(用户在上面的链接中询问)

在位图被回收或垃圾收集之前,它不会是。(commomsware 的回答)。

http://www.youtube.com/watch?v=_CruQY55HOk。讨论内存管理、内存泄漏和使用 MAT Analyzer。

于 2013-03-19T10:23:09.357 回答
1

您是否将所有图像都存储在堆中?如果是这样,您应该将它们缓存在 sd 卡或内部存储中,并在堆中只保留一堆(一个不错的方法是使用 LRU 缓存)。

如果您已经这样做了……您可以下载内存分析器工具并调试应用程序的内存使用情况。

http://www.eclipse.org/mat/

处理 OutOfMemoryError 真的很痛苦。

祝你好运!

于 2013-03-19T10:07:49.620 回答