When/why does my Java singleton instance get destroyed?(我的 Java 单例实例何时/为什么被销毁?)
问题描述
我有一个 android 应用程序,它设置为启动一个 Java 活动(称为 MyJavaActivity),它反过来启动一个 NativeActivity.当 NativeActivity 完成时,它会返回到 MyJavaActivity.
I have an android app that is setup to start a Java activity (call it MyJavaActivity), which in turn launches a NativeActivity. When the NativeActivity finishes it returns back to MyJavaActivity.
我还有一个 Java 单例类(称为 MyJavaSingleton),我希望在我的应用程序的整个生命周期中将其保留在内存中.我从我的 NativeActivity(使用 JNI)中设置了一些单例类的成员变量,这些变量稍后可以由 MyJavaActivity 检索.
I also have a Java singleton class (call it MyJavaSingleton) which I would like to stay in memory throughout my application's lifecycle. I set some of the singleton class's member variables from my NativeActivity (using JNI), which can later be retrieved by MyJavaActivity.
问题是,MyJavaSingleton 实例似乎在 NativeActive 退出之前一直在内存中,但是当 MyJavaActivity 再次启动时,它似乎又被设置为 null,所以我在 NativeActivity 中设置的所有变量现在都重置为默认值.为什么会这样?
The problem is, MyJavaSingleton instance seems to be in memory until NativeActive exits, but somehow seems to be set to null again when MyJavaActivity starts up again, so all the variables I had set in NativeActivity are now reset to their defaults. Why does this happen?
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 instance"在应用第一次启动时打印,然后在NativeActivity退出后(即android_main退出后)再次打印,并再次调用MyJavaActivity的onCreate.
In the above code extraction, "New MyJavaSIngleton instance" is printed when the app is first started, and then again right after the NativeActivity exits (ie after android_main is exited) and MyJavaActivity's onCreate is called again.
为什么重新进入MyJavaActivity时MyJavaSingleton.mInstance变成NULL了?
Why does MyJavaSingleton.mInstance become NULL when reentering MyJavaActivity?
推荐答案
每个 Android 应用程序都在自己的进程中运行,只要它继续运行,您的单例就可用.当进程终止时,你的单例就丢失了.因此,当应用重新启动时,需要重新创建这个单例对象.
Each Android app runs in its own process so as long as it keeps running, your singleton will be available. When the process dies, your singleton is lost. Therefore when the app is re-launched this singleton object will need to be re-created.
这篇关于我的 Java 单例实例何时/为什么被销毁?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:我的 Java 单例实例何时/为什么被销毁?
基础教程推荐
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01