非 Activity 类中需要上下文的情况

49

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

如何正确解决这个问题?

  1. 在每次调用时将其作为参数传递?
  2. 在类实例化时传递并保留它?
7个回答

34

这取决于类的角色。但无论如何,应该传递ApplicationContext而不是Activity。如果传递Activity context,则当您不再需要Activity时,gc无法将其从内存中删除。但是,应用程序上下文在应用程序尚未被操作系统完成时使用。请参阅避免内存泄漏


它不会随着活动消失吗? - theblitz
@theblitz 如果使用上下文对象,则不会被收集(与任何其他对象一样)。 - Maxim
我的意思是,当Activity关闭时,我的实例化类肯定会随之消失。 - theblitz
为什么在记事本示例中将“this”传递给NotesDbAdapter?难道不是同一件事吗? - theblitz
这是同样的事情。因此,他们的示例与我上面提到的文章的想法不匹配。您可以在Romain Guy在Google I/O上解释的CustomAdapter getView方法的convertView中遇到相同的问题。但是,在一些developer.android.com文章中没有使用convertView。 - Maxim
1
链接已失效 - 有新的参考资料吗? - Adam Matan

19

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

public class Example {
    protected Context context;

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

10

我一般使用构造函数参数的方式。我在实例化时将其传递并在实例化类中保留一个私有引用。

你需要考虑一个重要的问题。如果传递给Context的类存在时间比实例化它的Activity更长,那么你应该使用应用上下文。如果这个类正在做UI相关的操作,你将需要一个活动上下文。

确保传递给一个活动上下文的类不会存活比Activity更长,否则就会泄漏整个活动。

如果你不需要进行UI相关的操作,则使用应用上下文即可。


这是一个用户界面应用程序,因此在退出时实例化的类将会被销毁。 - theblitz
我知道这是一个UI应用程序,因为你提到了“Activity”,但需要上下文的类是否正在执行UI操作? - Octavian Helm
那么只需要将 this.getApplicationContext 传递给任何需要它的类,对吗? - theblitz
在那种特定情况下是的,但请记住我在答案中发布的内容。在这种情况下,您不总是能够做您想要的事情。 - Octavian Helm
所有我的用户界面都发生在顶层,所以这不应该是个问题。 - theblitz
显示剩余3条评论

3
我曾在这里回答过这个问题:here
你可以使用ContextWrapper,如此处所述
例如:
public class MyContextWrapper extends ContextWrapper {

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

}

并将该类用作上下文


3

我将它作为参数传递,我认为这是最好的做法。

这句话涉及到IT技术。

每次调用该函数时? - theblitz
根据情况而定。如果只在方法中需要,则使用参数。如果在类中多次使用,则将参数传递给构造函数并分配给属性:public class Example{ private Context mContext; public Example(Context context,int other, int other,int other){ this.context = context; [...] } public void method(){ Toast.makeText(mContext,"text",Toast.Toast.LENGTH_SHORT).show(); } } - Aracem

3

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

一个典型的例子是当您创建数据库帮助器时。请参见此链接


非常完美!正是我在寻找的。 - theblitz

1

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

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

    ...
}

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

但是,使用bean属性的方式可以保护您免受进一步代码更改的影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接