在静态成员中使用app上下文是一种好习惯吗?

时间:2015-07-25 12:52:57

标签: android android-context

public class App extends Application {
    public static App ctx;
    @Override
    public void onCreate() {
        super.onCreate();
        ctx = App.this;
    }
}

然后在每个非contextwrapper继承的类中需要一个Context我就像App.ctx一样使用它,我已经在我的应用程序中广泛使用它并且想知道,这是一个好的做法还是会导致内存泄漏或任何其他意外结果

关于Aritra Roy提供的答案:

  • 无法保证非静态onCreate()(您所在的位置) 初始化)将在任何静态初始化之前调用 需要上下文

根据谷歌文档:

  

void onCreate()在应用程序启动之前,在任何之前调用   活动,服务或接收者对象(不包括内容提供者)   已创建。

因此,除非您的应用程序向其他应用程序提供的服务到目前为止不是我的情况,否则您应该在调用onCreate之后进行应用程序流程中的任何调用。除非需要,否则不会调用静态块,因此在调用onCreate之后也会调用任何静态块。

  • 您的调用代码需要准备好处理来自的空值 因为这个,这使整个事情更加不方便

不相关,因为除非在您自己的代码的任何地方显式设置为null,否则App.ctx永远不会为null。根据前一点。

  • 这可能会导致巨大的内存泄漏问题

这正是我所询问的,这个陈述可能是真的,也可能是假的,但你没有备份它所以它没用。我实际上是在询问它是否可以导致它如何导致内存泄漏。

  • 无法在库项目中实现此静态Context,因为您 无法扩展Application对象。

这是不正确的,因为我自己做了它并且运作良好。

3 个答案:

答案 0 :(得分:1)

IMO的不良做法。 因为如果您将对象或对象的方法置于上下文中,那么您应该传递特定的上下文(Activity,Service等)。 我已经写了4年的应用程序,每次我写/看到这种类型的静态上下文是懒惰的。关于内存泄漏 - 我没有检查它,但它可能导致内存泄漏。想一想 - 如果你创建一个View(我知道你不会:))或其他对象,例如在cuntructor中使用静态上下文(这意味着其中一个成员需要附加上下文,最有可能)它不会被调用GC,即使它不再参与活动。

答案 1 :(得分:1)

我认为没关系。我有一个Android库,它实现了相同的想法(nv-android-base)。

从我23年的编程经验来看,应该归咎于Android的图书​​馆设计。尽管到目前为止,许多应用程序生命周期模型(如Applet,MIDlet和Xlet)已在此软件行业中设计,实现和商业化执行,但Android未能从经验中学习。 Android的库树的某些部分在设计上很糟糕,android.context.Context是这些可怕部分中的一个例子。 Android应该提供了一种从静态上下文中获取应用程序上下文的方法。

答案 2 :(得分:-1)

这是一个糟糕的编程习惯。我将强调几点支持它,

  • 无法保证在任何静态初始化之前调用非静态 onCreate()(您正在初始化的地方),这需要Context

  • 您的调用代码需要准备好处理 null值,因为这会使整个事情变得更加不方便

  • 这可能导致巨大的内存泄漏问题

  • 无法在库项目中实现此静态上下文,因为您无法扩展Application对象。