yan*_*nko 468 android android-context
在Android应用中,以下方法有什么问题:
public class MyApp extends android.app.Application {
private static MyApp instance;
public MyApp() {
instance = this;
}
public static Context getContext() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
并传递它到处(例如SQLiteOpenHelper)需要上下文(当然不泄漏)?
Ret*_*ier 405
这种方法存在一些潜在的问题,但在很多情况下(例如你的例子)它会很好用.
特别是在处理GUI
需要处理的任何事情时,你应该小心Context
.例如,如果将应用程序Context传递给LayoutInflater
您,则会出现异常.一般来说,你的方法是非常好的:Activity's
Context
在内部使用一个是好的做法Activity
,并且在Application Context
超出范围时传递上下文Activity
以避免内存泄漏.
此外,作为一种替代你的方式,你可以使用电话的快捷键getApplicationContext()
上的Context
对象(如活动)来获取应用程序上下文.
snc*_*tln 28
根据我的经验,这种方法不应该是必要的.如果你需要任何东西的上下文,你通常可以通过调用View.getContext()并使用在那里获得的Context来获取它,你可以调用Context.getApplicationContext()来获取Application上下文.如果你试图从一个Activity获取Appication上下文,你可以随时调用Activity.getApplication(),它应该能够作为调用SQLiteOpenHelper()所需的Context传递
总的来说,对于这种情况,您的方法似乎没有问题,但在处理Context时,请确保您没有像官方Google Android开发人员博客中所描述的那样泄漏内存
184*_*615 13
有人问过:单例如何返回空指针? 我正在回答这个问题.(我无法在评论中回答,因为我需要发布代码.)
它可能在两个事件之间返回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);
}
}
Run Code Online (Sandbox Code Playgroud)
我们运行代码:
$ javac A.java
$ java A
x:X@a63599 y:Y@9036e
x:null y:null
Run Code Online (Sandbox Code Playgroud)
第二行显示Y.xinstance和X.yinstance为空 ; 它们为null,因为变量X.xinstance和Y.yinstance在它们为null时被读取.
这可以修复吗?是,
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并且此代码没有显示任何异常:
$ javac A.java
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e
Run Code Online (Sandbox Code Playgroud)
但,这不是针对Android的选择Application
对象:在创建时,程序员不控制时间.
再一次:第一个示例和第二个示例之间的区别在于,如果静态指针为null,则第二个示例创建一个实例.但是,程序员不能创建的系统决定做之前的Android应用程序对象.
UPDATE
还有一个令人费解的例子,其中初始化的静态字段恰好是null
.
Main.java:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
你得到:
$ javac Main.java
$ java Main
first: FIRST second: SECOND
first: <FIRST> second: <SECOND>
first: nullFIRSTnull second: nullSECONDnull
Run Code Online (Sandbox Code Playgroud)
注意,你不能将静态变量声明移到一行上面,代码不会编译.
小智 9
您正在尝试创建一个包装器来获取应用程序上下文,并且它可能会返回" null
"指针.
根据我的理解,我猜它是更好的方法来调用2 Context.getApplicationContext()
或者任何一个
Activity.getApplication()
.
申请类别:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在AndroidManifest中声明应用程序:
<application android:name=".MyApplication"
...
/>
Run Code Online (Sandbox Code Playgroud)
用法:
MyApplication.getAppContext()
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法。我自己也用。我只建议覆盖onCreate
设置单例而不是使用构造函数。
并且因为您提到SQLiteOpenHelper
:onCreate ()
您也可以在其中打开数据库。
就我个人而言,我认为文档错误地说通常不需要子类化 Application。我认为恰恰相反:您应该始终子类化 Application。
归档时间: |
|
查看次数: |
289502 次 |
最近记录: |