Ich hab das mal unter Eclipse angeschaut. Der Fehler ist nicht offensichtlich, aber ein wenig Erfahrung half mir dann doch das Problem in ca. 3 Minuten zu finden.
Im Log sah ich folgendes:
02-12 01:06:40.519: DEBUG/dalvikvm(95): GC freed 2942 objects / 166504 bytes in 76ms
02-12 01:06:41.705: INFO/ActivityManager(52): Starting activity: Intent { cmp=eu.primescale.primecmdb/.gui.Statistics }
02-12 01:06:41.902: INFO/ActivityManager(52): Displayed activity eu.primescale.primecmdb/.gui.Statistics: 170 ms (total 170 ms)
02-12 01:06:41.959: DEBUG/AndroidRuntime(424): Shutting down VM
02-12 01:06:41.959: WARN/dalvikvm(424): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
02-12 01:06:41.959: ERROR/AndroidRuntime(424): Uncaught handler: thread main exiting due to uncaught exception
02-12 01:06:41.969: ERROR/AndroidRuntime(424): java.lang.RuntimeException: Unable to stop activity {eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB}: android.app.SuperNotCalledException: Activity {eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB} did not call through to super.onStop()
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3124)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3167)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.access$2400(ActivityThread.java:116)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1810)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.os.Looper.loop(Looper.java:123)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.main(ActivityThread.java:4203)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at java.lang.reflect.Method.invoke(Method.java:521)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at dalvik.system.NativeStart.main(Native Method)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): Caused by: android.app.SuperNotCalledException: Activity {eu.primescale.primecmdb/eu.primescale.primecmdb.gui.PrimeCMDB} did not call through to super.onStop()
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.Activity.performStop(Activity.java:3596)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3121)
02-12 01:06:41.969: ERROR/AndroidRuntime(424): ... 11 more
02-12 01:06:41.979: INFO/Process(52): Sending signal. PID: 424 SIG: 3
02-12 01:06:41.979: INFO/dalvikvm(424): threadid=7: reacting to signal 3
02-12 01:06:41.989: INFO/dalvikvm(424): Wrote stack trace to '/data/anr/traces.txt'
02-12 01:06:46.969: DEBUG/dalvikvm(200): GC freed 44 objects / 2128 bytes in 55ms
Einmal in die Klasse PRimCMDB geschaut, findet sich der Übeltäter auch sofort.
1@Override
2 public void onStop()
3 {
4 System.exit(RESULT_OK);
5 }
Das darf man nicht, an sich hätte man das aber sofort sehen müssen in den Logs.
Es wäre dadurch __richtiger__ folgendes zu schreiben:
1@Override
2 public void onStop()
3 {
4 super.onStop();
5 System.exit(RESULT_OK);
6 }
Allerdings führt das dazu das die Statistics Activity sofort beendet wird.
Ich rate daher dazu die onStop gar nicht zu implementieren und stattdessen evtl. mit startActivityForResult zu Arbeiten. Nebenbei lohnt hin und wieder ein Blick auf den Activity-Lifecycle.
Bei so wenig Code und diesem Problem sollte die letzte Änderung einfach wieder zurückgenommen werden um zu testen ob das zu dem Problem führt, so sitzt man nicht ratlos vor dem Rechner ;)
Noch was fällt am Code auf:
1System.exit(RESULT_OK);
Was soll das der JVM sagen ? RESULT_OK wird für inter-Activity Kommunikation benutzt, nicht als Return Code eines kompletten Prozesses in Android!
System.exit() will zwar einen parameter, dieser wird aber meines Wissens nach von der JVM komplett ignoriert, daher ist es gut einen anderen Entwickler der auf den Code schaut das Gefühl zu geben hier wird ein Rückgabe wert erwartet/geprüft an einer anderen Stelle! Daher ist eine System.exit(1); aussagekräftiger!
hth,
Mac
Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.