【问题标题】:How to release the actual Activity object memory after quitting out of the activity?退出活动后如何释放实际的活动对象内存?
【发布时间】:2011-10-12 22:33:11
【问题描述】:

我的 android 应用程序出现 OutofMemoryError,我对发生的事情有点困惑。基本上发生的情况是,我可以在前几次运行它,但是当我尝试退出它然后快速重复地再次打开它时,我得到一个内存不足的错误。

我已经尝试研究这个主题,并发现 recycle() 方法通常是问题所在。但是,我已经在每个位图(存储在对象容器中,存储在数组列表中)上调用了回收方法,但仍然遇到问题。

完成此操作后,我尝试使用 Eclipse 内存分析器查看堆转储,但遇到了一些奇怪的事情。退出活动后(回到启动器活动,然后通过按钮再次打开活动,我使用内存分析器截取了堆转储的屏幕截图。事实证明,每次我退出并重新进入活动,正在创建活动对象的另一个实例,并且没有释放旧的实例,即使正在调用 onDestroy() 方法(其中也有回收/清理代码。

然后我尝试覆盖 finalize 方法,以查看当活动退出回到启动器活动时是否正在调用它,但它没有被调用。我在其他一些 stackoverflow 线程上读到 finalize() 并不总是被调用,所以最后,我仍然不确定发生了什么。

最后,我的问题是: 我应该如何确保在退出活动进入另一个活动后释放活动对象(活动对象本身,而不是从活动创建的东西)?

【问题讨论】:

  • 您是否在进行堆转储之前运行了一次 GC,并且仍然看到该活动的多个实例?如果是这样,您可能会以某种方式泄漏 Activity。如果没有您的代码或有关您正在做什么的更多信息,很难猜测这是如何发生的。
  • 你得到解决方案了吗
  • 嗨,你有解决办法吗?你介意分享给任何人吗??

标签: android android-activity memory-management out-of-memory


【解决方案1】:

听起来您的应用程序存在内存泄漏问题,我建议您点击以下链接:
Avoiding Memory Leaks

Memory management for Android Apps

【讨论】:

【解决方案2】:

释放活动对象的一种方法是调用它的 onDestoy() 方法。将活动对象设为公共静态并在 onDestroy() 中使其为空

Public static Your_activity obj;

然后在onCreate方法中通过this初始化obj

obj=this;

在 onDestroy() 方法中这样做:

obj= null;

【讨论】:

  • 创建一个持有对对象的附加引用的变量并将这个自己的变量设置为 null 永远不会强制释放对象内存。
【解决方案3】:

一个选项是在清单文件中将启动模式设置为 singleInstance 或 singleTask。这将确保不会创建另一个 Activity 实例。

Documentation Example

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2018-08-27
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多