在非Activity类中需要Context

时间:2011-03-31 10:51:26

标签: android android-context

我的应用程序中有一些类需要调用需要Context作为参数的Android函数。 我没有它,因为类不是Activity类的子类。

解决这个问题的正确方法是什么?

  1. 在每次通话时将其作为参数传递?
  2. 在课程实例化中传递并保留它?

7 个答案:

答案 0 :(得分:32)

这取决于班级的作用。但无论如何都要通过ApplicationContext而不是活动1。如果您传递活动上下文gc无法在您不再需要活动后将其从内存中删除。但是,在OS.Refer Avoid Memory Leaks

完成应用程序时,会使用应用程序上下文

答案 1 :(得分:17)

将其作为参数传递。或者更好的是,获取应用程序上下文以避免内存泄漏。

public class Example {
    protected Context context;

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

答案 2 :(得分:10)

我几乎总是使用构造函数参数方法。我在实例化中传递它并在实例化的类中保留一个私有引用。

你必须考虑一件重要的事情。如果您传递Context的类将比实例化它的Activity更长,那么您应该使用应用程序上下文。如果该类正在进行UI操作,则需要一个活动上下文。

确保您传递活动上下文的课程的持续时间不会超过Activity,否则您将泄露整个活动。

如果您不做UI内容,请使用应用程序上下文。

答案 3 :(得分:3)

我将它作为参数传递,我认为它是最好的形式

答案 4 :(得分:3)

在课程实例化时传递它并保留它。

一个典型的例子是创建db帮助程序时。见link

答案 5 :(得分:2)

我也回答了这个问题here

您可以使用ContextWrapperas described here.

执行此操作

例如:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

}

并使用该类,因为它是Context

答案 6 :(得分:1)

最好的方法是遵循Bean方法:

public class Example {
    protected Context getContext() {
        ...
    }

    ...
}

然后它取决于访问上下文的可能性。如果类是完全独立的,那么构造函数参数和私有字段似乎是最好的方法。

但是bean属性方法可以防止你进一步修改代码。