【问题标题】:Passing Activity's context (prevent memory leak)传递 Activity 的上下文(防止内存泄漏)
【发布时间】:2015-05-30 06:57:58
【问题描述】:

我有一个非活动类,它在我的活动类中创建了许多视图,例如 ImageView 和 TextView。

为此,我需要将我的活动上下文从activity class 传递给non-activity class。这是我non-activity class的代码-

public class Create {
    Activity activity;

    Create(Activity act){
        activity = act;
    }
}

这是一个好习惯吗?我应该像这样使用getApplicationContext()吗?这两种方法有什么区别? -

public class Create {
    Context context;

    public Create(Context context){
        this.context = context.getApplicationContext();
    }
}

如果我使用上述方法,会不会有内存泄漏?哪种方法更好?使用后如何销毁上下文以防止内存泄漏?

像这样将Activity/Context 声明为finalprotected 有什么好处-

protected Context context;

final Context context;

【问题讨论】:

  • 它们之间没有区别。但是如果你想显示一些Views,比如Progress DialogAlert Dialog,那么你应该需要Activity Context。并且告诉你使用任何一种方法都没有内存泄漏。
  • 取决于 Create 的生命周期,你什么也没说。整个概念似乎有点不确定。

标签: java android memory-leaks


【解决方案1】:

这取决于您如何使用 Create 对象。如果你像这样使用它:

public class MyActivity extends Activity {
    public void someMethod() {
        Create mCreate = new Create(this);
        mCreate.doSomething();
    }
}

会好的。如果您执行诸如使用在后台执行某些操作的内部类之类的操作,并且活动已关闭,那么如果内部类尚未完成处理,您最终可能会泄漏上下文。

在使用 context.getapplicationcontext 与传递活动(这是一个上下文)的情况下,后者在这种情况下更好,因为我假设您的创建类只是为其关联的活动创建视图;一旦活动完成,这些视图的生命周期可能就结束了。

【讨论】:

    【解决方案2】:

    Android Activity 扩展了 ContextThemeWrapper。

    ContextThemeWrapper 最终扩展了上下文。

    因此,将 Context 视为超类,将 Activity 视为子类。例如,Context 有 10 个方法,而 Activity 有相同的 10 个方法加上 20 个其他方法。

    就内存泄漏而言,这完全取决于您如何使用它。确保在 onDestroy() 中销毁所有未使用的对象以防止内存泄漏。见http://www.raizlabs.com/dev/2014/04/hunting-your-leaks-memory-management-in-android-part-2-of-2/

    我更喜欢第一种方法。这样,您仍然可以访问 Activity 提供的 Context 可能没有的其他方法。

    您可以这样做: 公共类创建扩展SomethingThatRequiresASuper { 活动活动;

    Create(Activity act){
        this.activity = act;
    super (act.getApplicationContext())
    }
    

    }

    您可以根据需要声明上下文受保护。这只是意味着该对象的范围是有限的。

    不要宣布它是最终的。如果这样做,您以后将无法更改上下文。

    【讨论】:

      【解决方案3】:

      我认为通过上下文会很好。如果您在 android 框架中开发,您可以直接在 View 中使用属性“mContext”,但这在 SDK 中不起作用。

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 2015-02-05
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 2016-07-10
        • 2011-12-05
        相关资源
        最近更新 更多