我在Application.onCreate中启动一个单例实例,这个实例有一个由mApplicationContext
启动的成员getApplicationContext()
,这是mApplicationContext唯一分配值的地方。从崩溃日志中,mApplicationContext
在某些情况下变为空,我的问题是这会发生吗?
public class ClassicSingleton {
private static ClassicSingleton instance = null;
private Context mApplicationContext = null;
private ClassicSingleton() {
}
public static ClassicSingleton getInstance() {
if(instance == null) {
instance = new ClassicSingleton();
}
return instance;
}
public void initiate(Context context){
this.mApplicationContext = context;
}
}
public class MyApplication extends Application{
@Override
public void onCreate()
{
super.onCreate();
ClassicSingleton.getInstance().initiate(getApplicationContext());
}
}
我在Android static object lifecycle找到了类似的问题,但它没有回答我的问题。
答案 0 :(得分:0)
由于您正在编写图书馆,因此请不要信任调用者以使其正确。校验! 即:
public void initiate(Context context){
if (context == null) {
throw new Error("Attempt to set null context");
}
if (mApplicationContext != null) {
throw new Error("Why are you setting context twice?");
}
this.mApplicationContext = context.getApplicationContext();
}
请注意,对getApplicationContext
的调用可确保您不会错误地保存活动上下文。另一种方法是抛出上下文!= context.getApplicationContext(),但这可能有点过分。
这不会修复您的错误,但它会帮助您快速找到它。
哦 - 你可以找到比Error
更好:
public static ClassicSingleton getInstance() {
if(instance == null) {
throw new Error("you forgot to initiate ClassicSingleton!");
}
return instance;
}
public static void initiate(Context context){
if (context == null) {
throw new Error("Attempt to set null context");
}
if (instance == null) {
instance = new ClassicSingleton();
}else{
// optional
throw new Error("Why are you initializing ClassicSingleton twice?");
}
instance.mApplicationContext = context.getApplicationContext();
}