【问题标题】:When is mContext null-cleared? (widget, adapter etc.)mContext 何时清零? (小部件、适配器等)
【发布时间】:2012-09-03 05:14:20
【问题描述】:

我现在正在与内存泄漏作斗争。

只是出于好奇, View 或 Adapter 类的成员 mContext 何时清空?

我找不到做这种事情的角色...

编辑:

我知道 GC,但例如,

一个ArrayAdapter有mContext,如果Activity有这个ArrayAdapter的引用, 这是循环引用吗?

【问题讨论】:

  • 你听说过垃圾收集器吗?
  • 尽可能尝试传递应用程序上下文 (getContext().getApplicationContext())。它是您拥有的最永久的上下文。将活动传递给其他类很可能会留下很多悬而未决的活动参考。一旦我在堆中有 42 个同一个 Activity 类的实例,而我应该只有一个,这是由于内部类引起的循环引用,它也被传递了。

标签: android memory-leaks frameworks android-context


【解决方案1】:

检查何时释放空变量是您无法控制的。但是你可以避免OOME问题。

正如 Dmitry 所说,如果您使用的是Bitmaps,请在使用后立即调用其recycle() 方法。 通过这种方式,您可以清除您持有的资源并为应用程序运行腾出空间。

调用GC是没有用的,因为即使你调用它,也不确定GC是否会释放你的资源。

还要检查您的代码中是否存在内存泄漏问题。因为这也可能导致OOME。可以使用MAT(plugin) for eclipse来检查内存泄漏问题。

即使这不能解决您的问题,也请询问我们,我们会尝试寻找其他解决方案。

谢谢你:)

【讨论】:

    【解决方案2】:

    上下文通常是拥有的 Activity,由 Android 管理。保证活动有效,直到Activity被激活。除非您正在做一些棘手或相当低级别的事情,否则您不应该在视图和适配器中对mContext 保持一致。

    您应该关注的是将活动的引用(例如在Context mContext 或类似字段中)存储在一个可能比活动寿命更长的类(服务、线程、应用程序类等)中。 .这将阻止系统正确地对活动进行 GC,并导致内存泄漏和细微的错误。

    【讨论】:

      【解决方案3】:

      在垃圾收集器得到它之前不会被清除。换句话说 - 你不应该担心清除你的变量,因为如果没有对它们的引用,它们都会被 GC 收集(不是立即,但它们会)。

      但是 Android 中有一个类会引起麻烦 - Bitmap。如果您的应用程序中存在内存泄漏,首先 - 查看位图使用情况。完成后请务必致电recycle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 2022-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多