Wann/warum funktioniert mein Java singleton-Instanz zerstört werden?

Habe ich eine android-app, ist das setup zum starten einer Java-Aktivität (nennen wir es MyJavaActivity), die wiederum startet eine NativeActivity. Wenn die NativeActivity beendet, es kehrt zurück zu MyJavaActivity.

Ich habe auch ein Java-singleton-Klasse (nennen wir es MyJavaSingleton) ich möchte bleiben im Speicher, während meiner gesamten application lifecycle. Ich setzen einige der singleton-Klasse member-Variablen, aus meiner NativeActivity (über JNI), die können später abgerufen werden MyJavaActivity.

Das problem ist, MyJavaSingleton Instanz zu sein scheint, im Speicher, bis NativeActive beendet, aber irgendwie scheint auf null zu setzen wieder, wenn MyJavaActivity wieder startet, also alle Variablen, die ich gesetzt hatte in NativeActivity sind jetzt auf die Standardwerte zurückgesetzt. Warum geschieht dieses?

 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! 
 }

Im obigen code-Extraktion, die "Neue MyJavaSIngleton Instanz" wird gedruckt, wenn Sie die app zum ersten mal gestartet, und dann wieder rechts, nach der NativeActivity beendet (dh nach android_main verlassen wird) und MyJavaActivity die onCreate wird aufgerufen, wieder.

Warum MyJavaSingleton.mInstance werden NULL, wenn wieder MyJavaActivity?

  • warum sind Sie durch den Aufruf von exit()? Nicht, dass tötet die JVM, oder bin ich da unwissend von Android?
  • Ja, ich mag es nicht zu nennen, exit (), ich denke, dies ist ein hack, aber die Anwendung scheint nicht zurück zu MyJavaActivity, es sei denn, ich mache das.
  • finish() funktioniert nicht?
  • Wie @James singleton sagte, Sie sollten privat sein. Auch, wie geschrieben, Instance() sollte synchronized.
  • Nein, In meinem code-Ausschnitt können Sie sehen, ich nenne das native äquivalent zu " finish(), which is ANativeActivity_finish. With only this (and no exit()), the app does not return to MyJavaActivity, it simply stops at the last screen that NativeActivity` zeigte. @Hemal ich erwähnte dies in einem früheren Kommentar - aber ich hatte ursprünglich es zu private und das Verhalten ist das gleiche. Ich habe versucht, hinzufügen von "synchronisiert", obwohl immer noch die gleichen Ergebnisse 🙁 ich werde zu aktualisieren meinem code oben zu zeigen, diese beiden änderungen.
  • Ich weiß nicht, wie laden von Klassen funktioniert in Android, aber es würde eine Instanz der static für die einzelnen classloader das laden der Klasse, denn es würde eine Instanz der Klasse per classloader. Man könnte hinzufügen, ein ein static {System.out.println("Loading MyJavaSingleton");} wenn dies der Fall sein könnte
  • Danke für den Tipp! Ich fügte hinzu, diese statischen print-Anweisung und es wird zwei mal aufgerufen, jedes mal direkt nach `MyJavaActivity::onCreate' eingetragen. Nicht sicher, ob ich verstehe, warum aber?
  • Ich denke, weil die Klasse bekam entladen früher. Sie drucken konnte, der classloader in der static-block, um zu sehen, wenn Sie unterschiedlich sind. MyJavaSingleton.class.getClassLoader(). Ich weiß nicht genug über Android, so Frage ich mich, warum MyJavaActivity.onCreate bekommt sogar wieder angerufen. Ist die Anwendung wieder starten?

Schreibe einen Kommentar