为什么在Application.onCreate中初始化的静态实例会丢失其值

时间:2017-08-16 13:43:07

标签: android static android-context

我在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找到了类似的问题,但它没有回答我的问题。

1 个答案:

答案 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();
}