随处使用应用程序上下

在Android应用程序中,以下方法有什么不妥之处:

public class MyApp extends android.app.Application {

    private static MyApp instance;

    public MyApp() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }

}

并将其传递到需要上下文(并且当然不会泄漏)的地方(例如SQLiteOpenHelper)?


这种方法存在一些潜在的问题,尽管在很多情况下(比如你的例子),它可以很好地工作。

特别是在处理需要ContextGUI ,应该小心。 例如,如果您将应用程序上下文传递给LayoutInflater您将得到一个异常。 一般来说,你的做法是优秀的:这是很好的做法是使用一个Activity's Context是内Activity ,而Application Context通过上下文当超出范围Activity ,以避免内存泄漏。

此外,作为模式的替代方法 ,您可以使用在Context对象(如Activity)上调用getApplicationContext()的快捷方式来获取应用程序上下文。


根据我的经验,这种方法不应该是必需的。 如果您需要上下文来处理任何事情,通常可以通过调用View.getContext()并使用获得的上下文来获取它,您可以调用Context.getApplicationContext()来获取应用程序上下文。 如果你试图从一个Activity获取Appication上下文,你总是可以调用Activity.getApplication(),它应该能够作为Context调用SQLiteOpenHelper()所需的上下文来传递。

总的来说,对于这种情况,您的方法似乎没有问题,但在处理Context时,请确保您没有按照官方Google Android开发人员博客中的描述在任何地方泄漏内存


有人问: 单身人士如何返回空指针? 我正在回答这个问题。 (我无法在评论中回答,因为我需要发布代码。)

它可能在两个事件之间返回null:(1)类被加载,(2)这个类的对象被创建。 这是一个例子:

class X {
    static X xinstance;
    static Y yinstance = Y.yinstance;
    X() {xinstance=this;}
}
class Y {
    static X xinstance = X.xinstance;
    static Y yinstance;
    Y() {yinstance=this;}
}

public class A {
    public static void main(String[] p) {
    X x = new X();
    Y y = new Y();
    System.out.println("x:"+X.xinstance+" y:"+Y.yinstance);
    System.out.println("x:"+Y.xinstance+" y:"+X.yinstance);
    }
}

让我们运行代码:

$ javac A.java 
$ java A
x:X@a63599 y:Y@9036e
x:null y:null

第二行显示Y.xinstance和X.yinstance为空; 它们为空,因为变量X.xinstance和Y.yinstance在它们为空时被读取。

这可以解决吗? 是,

class X {
    static Y y = Y.getInstance();
    static X theinstance;
    static X getInstance() {if(theinstance==null) {theinstance = new X();} return theinstance;}
}
class Y {
    static X x = X.getInstance();
    static Y theinstance;
    static Y getInstance() {if(theinstance==null) {theinstance = new Y();} return theinstance;}
}

public class A {
    public static void main(String[] p) {
    System.out.println("x:"+X.getInstance()+" y:"+Y.getInstance());
    System.out.println("x:"+Y.x+" y:"+X.y);
    }
}

而这段代码没有显示异常:

$ javac A.java 
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e

但这不是针对Android的选择Application对象:在创建时,程序员不控制时间。

再一次说明:第一个例子和第二个例子的区别在于,如果静态指针为空,则第二个示例创建一个实例。 但是,在系统决定去做之前,程序员不能创建Android应用程序对象。

链接地址: http://www.djcxy.com/p/91379.html

上一篇: Using Application context everywhere?

下一篇: Trying to understand Context and its use in Android