随处使用应用程序上下
在Android应用程序中,以下方法有什么不妥之处:
public class MyApp extends android.app.Application {
private static MyApp instance;
public MyApp() {
instance = this;
}
public static Context getContext() {
return instance;
}
}
并将其传递到需要上下文(并且当然不会泄漏)的地方(例如SQLiteOpenHelper)?
这种方法存在一些潜在的问题,尽管在很多情况下(比如你的例子),它可以很好地工作。
特别是在处理需要Context
的GUI
,应该小心。 例如,如果您将应用程序上下文传递给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