【问题标题】:why a static instance initialized in Application.onCreate loses its value为什么在 Application.onCreate 中初始化的静态实例失去了它的价值
【发布时间】:2017-08-16 13:43:06
【问题描述】:

我在Application.onCreate中启动了一个单例实例,这个实例有一个成员mApplicationContext,它是由getApplicationContext()发起的,这是mApplicationContext唯一被赋值的地方。从崩溃日志中,mApplicationContext 在某些情况下会变为 null,我的问题是在哪些情况下会发生这种情况?

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

【问题讨论】:

标签: android static android-context


【解决方案1】:

由于您正在编写一个库,因此不要相信调用者会正确处理它。查看! 即:

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 的调用可确保您不会错误地保存活动上下文。另一种方法是抛出 if context != 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2011-09-15
    相关资源
    最近更新 更多