代码之家  ›  专栏  ›  技术社区  ›  yanchenko

到处使用应用程序上下文?

  •  437
  • yanchenko  · 技术社区  · 15 年前

    在Android应用程序中,以下方法是否有问题:

    public class MyApp extends android.app.Application {
    
        private static MyApp instance;
    
        public MyApp() {
            instance = this;
        }
    
        public static Context getContext() {
            return instance;
        }
    
    }
    

    10 回复  |  直到 14 年前
        1
  •  426
  •   Pavneet_Singh    8 年前

    这种方法有几个潜在的问题,尽管在很多情况下(例如您的示例),它会很好地工作。

    GUI 这需要一个 Context . 例如,如果将应用程序上下文传递到 LayoutInflater 你会得到一个例外。总的来说,您的方法非常好:使用 Activity's 上下文 Activity ,以及 Application Context 当传递的上下文超出 avoid memory leaks .

    而且作为一个 可供替代的 对于您的模式,您可以使用呼叫的快捷方式 getApplicationContext() 上下文 对象(如活动)以获取应用程序上下文。

        2
  •  30
  •   xarlymg89 MiguelSlv    5 年前

    根据我的经验,这种方法不应该是必要的。如果您需要任何内容的上下文,通常可以通过调用 View.getContext() Context Context.getApplicationContext() 得到 Application 上下文如果你想得到 应用 从一个角度来看这一点 Activity 你随时可以打电话 Activity.getApplication() 应该能够作为 上下文 需要打电话给 SQLiteOpenHelper() .

    总的来说,在这种情况下,您的方法似乎没有问题,但在处理 Google Android Developers blog .

        3
  •  14
  •   18446744073709551615    6 年前

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

    在两个事件之间,它可能返回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
    

    第二行显示 X.I立场 无效的 ; 它们是空的,因为变量 ans 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

    再次说明:第一个示例和第二个示例之间的区别在于,如果静态指针为null,第二个示例将创建一个实例。但是程序员不能创建 这个 Android应用程序对象,然后系统决定这样做。

    使现代化

    null .

    主类 :

    enum MyEnum {
        FIRST,SECOND;
        private static String prefix="<", suffix=">";
        String myName;
        MyEnum() {
            myName = makeMyName();
        }
        String makeMyName() {
            return prefix + name() + suffix;
        }
        String getMyName() {
            return myName;
        }
    }
    public class Main {
        public static void main(String args[]) {
            System.out.println("first: "+MyEnum.FIRST+" second: "+MyEnum.SECOND);
            System.out.println("first: "+MyEnum.FIRST.makeMyName()+" second: "+MyEnum.SECOND.makeMyName());
            System.out.println("first: "+MyEnum.FIRST.getMyName()+" second: "+MyEnum.SECOND.getMyName());
        }
    }
    

    $ javac Main.java
    $ java Main
    first: FIRST second: SECOND
    first: <FIRST> second: <SECOND>
    first: nullFIRSTnull second: nullSECONDnull
    

    请注意,不能将静态变量声明上移一行,代码将不会编译。

        4
  •  12
  •   toha    8 年前

    应用程序类别:

    import android.app.Application;
    import android.content.Context;
    
    public class MyApplication extends Application {
    
        private static Context mContext;
    
        public void onCreate() {
            super.onCreate();
            mContext = getApplicationContext();
        }
    
        public static Context getAppContext() {
            return mContext;
        }
    
    }
    

    在AndroidManifest中声明应用程序:

    <application android:name=".MyApplication"
        ...
    />
    

    用法:

    MyApplication.getAppContext()
    
        5
  •  8
  •   machei    10 年前

    您正在尝试创建一个包装器以获取应用程序上下文,它可能会返回“ null “指针。

    根据我的理解,我想这是一种更好的呼叫方式——2种方式中的任何一种 Context.getApplicationContext() Activity.getApplication() .

        6
  •  5
  •   Martin    11 年前

    这是一个好办法。我自己也用。我只建议撤销 onCreate 设置单例而不是使用构造函数。

    SQLiteOpenHelper :在 onCreate () 您也可以打开数据库。

    就我个人而言,我认为文件中的说法是错误的 . 我认为情况正好相反:您应该始终将应用程序子类化。

        7
  •  3
  •   Blundell    10 年前

    我将使用应用程序上下文在构造函数中获取系统服务。这简化了测试和测试;作文的好处

    public class MyActivity extends Activity {
    
        private final NotificationManager notificationManager;
    
        public MyActivity() {
           this(MyApp.getContext().getSystemService(NOTIFICATION_SERVICE));
        }
    
        public MyActivity(NotificationManager notificationManager) {
           this.notificationManager = notificationManager;
        }
    
        // onCreate etc
    
    }
    

        8
  •  2
  •   CoolBeans Jake    13 年前

    我喜欢,但我建议你选择单身:

    package com.mobidrone;
    
    import android.app.Application;
    import android.content.Context;
    
    public class ApplicationContext extends Application
    {
        private static ApplicationContext instance = null;
    
        private ApplicationContext()
        {
            instance = this;
        }
    
        public static Context getInstance()
        {
            if (null == instance)
            {
                instance = new ApplicationContext();
            }
    
            return instance;
        }
    }
    
        9
  •  1
  •   Seraphim's    11 年前

    我使用相同的方法,我建议将singleton编写得更好一些:

    public static MyApp getInstance() {
    
        if (instance == null) {
            synchronized (MyApp.class) {
                if (instance == null) {
                    instance = new MyApp ();
                }
            }
        }
    
        return instance;
    }
    

    getContext() getApplicationContext() 在那里我可以做到!