当前位置: 首页 > 面试题库 >

什么时候/为什么我的Java单例实例被销毁?

微生学
2023-03-14
问题内容

我有一个设置为启动Java活动(称为MyJavaActivity)的android应用,这反过来又会启动NativeActivity。NativeActivity完成后,它将返回到MyJavaActivity。

我还有一个Java单例类(称为MyJavaSingleton),我希望在应用程序的整个生命周期中都将其保留在内存中。我从NativeActivity(使用JNI)中设置了一些单例类的成员变量,以后可以由MyJavaActivity检索。

问题是,MyJavaSingleton实例似乎一直在内存中,直到NativeActive退出为止,但是当MyJavaActivity再次启动时,似乎又以某种方式再次设置为null,因此我在NativeActivity中设置的所有变量现在都重置为其默认值。为什么会这样?

 public class MyJavaActivity extends Activity implements View.OnTouchListener
 {
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
    super.onCreate(savedInstanceState);
    MyJavaSingleton.Instance().DoStuff();
   }

   @Override
   public boolean onTouch(View arg0, MotionEvent arg1) 
   {
      Intent intent = new Intent(MyJavaActivity.this, NativeActivity.class);
      startActivity(intent); // at this point, android_main will be executed 
   }
 }

 /////////////////////////////
 public class MyJavaSingleton
 {
   static private MyJavaSingleton mInstance = null;
    synchronized public static MyJavaSingleton Instance()
{
    if( mInstance == null )
    {
        mInstance = new MyJavaSingleton();
        Log.v(TAG, "New MyJavaSIngleton instance");
    }
    return mInstance;
}
 }
 /////////////////////////////
 // Native 
 void android_main(struct android_app* state) 
 {
     // Do various stuff, set some variables on the MyJavaSingleton
     // At this point, MyJavaSingleton.mInstance is still at the same address in memory, which is good //
     ANativeActivity_finish(state->activity);
     exit(0);
     // Problem: sometime after this exit and before MyJavaActivity::onCreate is called, MyJavaSingleton.mInstance is set to null! 
 }

在上面的代码提取中,在首次启动应用程序时打印“ New
MyJavaSIngleton实例”,然后在NativeActivity退出后(即,在android_main退出之后)再次打印,并再次调用MyJavaActivity的onCreate。

重新输入MyJavaActivity时,为什么MyJavaSingleton.mInstance变为NULL?


问题答案:

每个Android应用程序都以自己的进程运行,因此只要它继续运行,您的单身人士就可以使用。当进程终止时,您的单例将丢失。因此,当应用重新启动时,将需要重新创建该单例对象。



 类似资料:
  • 问题内容: 我知道单例类是只能有一个实例化的类,但是我不明白为什么这样做会有用。为什么不只创建带有静态变量和方法的类,并在需要时使用sync来确保没有两个线程同时执行该类中的方法。我只是不明白为什么有人会遇到创建此类课程的麻烦。我知道我在这里想念什么。 谢谢, 问题答案: 当我同意其他答案时,OP询问为什么不使用具有所有静态方法的类(可能具有静态字段),而不是拥有一个实例的单例。 为什么使用单身人

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • 问题内容: 请帮忙。将来自扫描仪的提示显示到控制台后,出现此错误: 问题是来自printf吗?我检查了格式,它看起来正确。 这是程序: 问题答案: 答:因为您的格式说明符与方法中使用的输入参数不匹配。 使用而不是将值用作格式说明符 另外需要额外的逃脱角色 最后,删除不必要的点字符 阅读:Formatter javadoc

  • 问题内容: 使用Java 注释的最佳实践是什么?为什么? 用注解标记每个覆盖的方法似乎是过大的。是否存在某些编程情况要求使用和其他不应该使用的情况? 问题答案: 每次你重写一种方法都有两个好处时使用它。这样做是为了使你能够利用编译器检查的优势,以确保你认为自己确实覆盖了某个方法。这样,如果你犯了拼写错误的方法名称或不正确匹配参数的常见错误,将会警告你方法实际上并没有像你认为的那样覆盖。其次,它使你

  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码

  • 我正在尝试通过对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。 方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将描述为检查是否存在另一个Input的正确方法,从而使方