在课堂上设置全局上下文的不良做法?

时间:2016-07-23 19:24:09

标签: android

如果我在对象的构造函数中传递上下文,如果正在创建的对象是长期居住的对象或单例,那么这可能会导致内存泄漏。示例如下。

public class MyObject{
    private final Context context;

    public MyObject(Context context){
        this.context=context;
    } 
}

最好从getApplicationContext()设置上下文,因为它返回应用程序类的单例而不是引用类实例的上下文,如此吗?

context =  context.getApplicationContext();  

3 个答案:

答案 0 :(得分:5)

  

如果我在对象的构造函数中传递上下文,如果正在创建的对象是长期居住的对象或单个单元,那么这可能会导致内存泄漏

是。例如,如果ContextActivity,则Activity被销毁后,通常会被垃圾收集。但是,如果您从static字段引用它,则无法对其进行垃圾回收。除非您更新该字段,否则您将泄漏Activity及其引用的所有内容。

  

最好从getApplicationContext()

设置上下文

是。正如您所注意到的,Application上下文是一个单例,它在您的过程中持续存在。实际上,它是“预泄漏”。你不能通过另一个static字段指向它来进一步泄漏它。

答案 1 :(得分:2)

在Android上,Context用于许多操作,但主要用于加载和访问资源。这就是为什么所有小部件在其构造函数中都接收Context参数的原因。在常规Android应用程序中,通常有两种Context,Activity和Application。它通常是开发人员传递给需要Context的类和方法的第一个:

这意味着视图可以引用整个活动,因此也可以引用您的活动所持有的任何内容;通常是整个View层次结构及其所有资源。因此,如果泄漏Context(“泄漏”意味着您保留对它的引用从而阻止GC收集它),则会泄漏大量内存。如果你不小心,可以很容易地泄漏整个活动。

其他常见的Android不良行为here

答案 2 :(得分:1)

是的,我认为这很好。我在全球范围内使用过这种情况

public class AppApplication extends Application {
    private static AppApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static AppApplication getInstance() {
        return instance;
    }

    public Context getContext() {
        return this;
    }
}

每当我必须使用时,只需获取这样的上下文..

AppApplication.getInstance().getContext();

不要忘记在清单文件中添加此内容。

<application
    android:name="yourpackage_name.AppApplication">
    ...
    <activity/>
    ...
    ...
</application>