传递活动的上下文(防止内存泄漏)

时间:2015-05-30 06:57:58

标签: java android memory-leaks

我有一个非活动类,它在我的活动类中创建了许多像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;

3 个答案:

答案 0 :(得分:1)

这取决于您使用Create对象的方式。如果您正在使用它:

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

没关系。如果你做了一些事情,比如使用在后台执行某些操作的内部类,并且活动已关闭,那么如果内部类尚未完成处理,则最终可能会泄漏上下文。

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

答案 1 :(得分:1)

Android Activity扩展了ContextThemeWrapper。

ContextThemeWrapper ultimatley扩展了Context。

因此将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可能没有的其他方法。

你可以这样做: public class Create extends SomethingThatRequiresASuper {     活动活动;

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

}

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

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

答案 2 :(得分:0)

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