Android Activity 堆积在后台导致 OutOfMemory 错误

标签 android performance android-activity memory-management

我有一个应用程序允许用户访问照片库中的用户个人资料(想想 Instagram,您可以在其中从图像访问用户的个人资料,或者访问对图像发表评论的用户的个人资料等)。

问题:

如果用户继续访问个人资料和照片库并重复此循环大约 10 次,则 ViewProfile 的实例过多和 Gallery在导致 OutOfMemory 的后台堆栈上错误。这是因为 ActivityA电话 startActivity()开始ActivityB (谁可以开始 ActivityC 等等)所以 finish()未调用 ActivityAActivityB .

我想知道的:

由于 Activity 调用其他 Activity ,应用程序可能会运行很长时间而不调用 finish()关于堆积在后台的 Activity 。

所以我的第一个问题是:

1) 我应该 onPause()方法是尽可能多地清理以减少内存中的 Activity 占用空间?

2) 如果 finish 是否有可能将 Activity 的足迹减少到零(或接近零) (因此 onDestroy )没有被调用(或者如果用户决定四处走动并浏览其他用户的图像和个人资料,则不能期望在合理的时间内被调用)?

3) 在 Activity 管理方面,我是否忽略了什么?

4) 有没有办法完全终止 Activity 但保存其状态,以便在按下后退按钮时可以按照用户期望的方式重建它?

期望行为示例:

在 Instagram 应用程序中,用户似乎可以无休止地点击用户个人资料(来自评论或喜欢),然后加载这些用户的图像,然后访问个人资料直到时间结束而不会崩溃。显然他们在做一些不同的事情但我不确定到底是什么。看起来他们很长一段时间都没有调用finish。他们的 Activity 也是如此,因为一个 Activity 调用另一个 Activity ,并且他们维护一个可以在用户点击后退按钮时展开的后台堆栈。

我觉得我做错了什么,但我什至不知道我是否知道要提出正确的问题来解决问题。如果我避免打开大量随机用户的配置文件或返回将重置应用程序状态的“主页”,我的应用程序就会工作。任何帮助将不胜感激。

最佳答案

主要问题是您的位图。他们使用的内存最多。永远不要在类里面直接举起一个。使用 LRUCache,决定通常在 Bitmaps 上使用多少内存,并且只在 Activity/fragments 中保存缓存键。这将确保位图使用固定数量的内存,并且额外 Activity 增加的只是键的大小。二级缓存(内存缓存和磁盘缓存)是个好主意。根据问题的严重程度,您甚至可能想极端地取消 onPause 中的 ImageViews 可绘制对象,这样引用也不会保留。在您的情况下可能有必要。

在更通用的解决方案中,您需要按照您的想法进行操作 - 在 onStop 中,您需要从内存中丢弃您可以使用的内容,然后在 onStart 中从磁盘或网络重新加载它,尽可能选择磁盘。 Activity 之间共享的数据结构不应存储在内存中的多个位置,它们应该通过服务或单例共享。您无法 100% 阻止此问题(用户始终可以决定访问 1000 个配置文件),但如果您防止内存占用资源被复制,您可以使它成为他们几乎必须尝试访问的资源。

关于Android Activity 堆积在后台导致 OutOfMemory 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28548190/

相关文章:

java - 在Java中解析JSON字符串,为什么说 "No value for ..."

android - 如何获取我的应用程序的移动数据使用情况(例如使用 TrafficStats)?

android - Android 设备列表中不支持 Droid DNA

java - 如何测量通过 RMI 发送的对象的大小?

java - 重新启动 Activity 时调用 onStop 延迟

android - 在 Android 相机上测量 fps 的准确方法

sql - PostgreSQL 索引性能增益/损失在短时间后生效

performance - 用定时器测试 Erlang 函数的性能

android kotlin - 开始 Activity 并从 Intent 中获取数据

android - 透明、 float 的 Android Activity 不允许更新其背后的内容