2013-03-05 12 views
7

Heute bemerkte ich ein seltsames Verhalten in meiner Anwendung.Fragment onActivityCreated() wird nach onDestroy() der Aktivität aufgerufen

Es passiert, wenn ich meine Anwendung mit der Geräteansicht von Eclipse stoppe. Kann es jemand erklären?

Warum wird onActivityCreated() von Fragment aufgerufen, auch wenn Activity bereits zerstört ist? MyHomeActivity enthält zwei Fragment s und ähnliches Protokoll wird für beide generiert.

Hier kleben ich Protokolle für eine Fragment. NullPointerException ist ein sekundäres Problem.

Ich bin überrascht, warum onActivityCreated() aufgerufen wird, wenn der Aufruf-Stack von onDestroy() von MyHomeActivity initiiert wurde?

03-05 12:31:21.414: W/System.err(5638): java.lang.NullPointerException 
03-05 12:31:21.421: W/System.err(5638):  at **MyListViewFrag.onActivityCreated**(BuddyListViewFrag.java:85) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 
03-05 12:31:21.421: W/System.err(5638):  at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 
03-05 12:31:21.421: W/System.err(5638):  at MyFragmentActivity.onDestroy(RbrFragmentActivity.java:57) 
03-05 12:31:21.421: W/System.err(5638):  at **MyHomeActivity.onDestroy**(MyHomeActivity.java:254) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2663) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2694) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.access$2100(ActivityThread.java:117) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 
03-05 12:31:21.421: W/System.err(5638):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-05 12:31:21.421: W/System.err(5638):  at android.os.Looper.loop(Looper.java:130) 
03-05 12:31:21.421: W/System.err(5638):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
03-05 12:31:21.429: W/System.err(5638):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 12:31:21.429: W/System.err(5638):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-05 12:31:21.429: W/System.err(5638):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
03-05 12:31:21.429: W/System.err(5638):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
03-05 12:31:21.429: W/System.err(5638):  at dalvik.system.NativeStart.main(Native Method) 

Ich bin mit Support-Bibliothek für die Bereitstellung von Fragment s Geräte-HoneyComb vor, wenn das einen Unterschied macht.

+0

Sie scheinen den OnDestroy-Callback zu überschreiben. Was machst du da? – Luksprog

+0

nichts, das nur super.OnDestroy() ruft – aProgrammer

+0

Ich bemerkte gerade dieses gleiche Verhalten auf meinem 4.2 Nacheiferer. Hast du mehr Infos gefunden? –

Antwort

14

Nach einigen Tests und Überprüfung FragmentManager.moveToState, ich glaube, dass, wenn die Fragment von einem FragmentPagerAdapter gehandhabt wird, ist es unvermeidbar ist, dass ein Fragment die zuvor in savedState (als Teil des Prozesses des Anhaltens der App, bevor Sie die töten verschmolzen wurde Prozess von der Registerkarte DDMS in Eclipse), muss zuerst "erstellt" werden (in der Terminologie FragmentManager), bevor es zerstört werden kann.

Dies kann eine unbeabsichtigte Konsequenz der Wiederherstellung der Fragmente aus dem gespeicherten Zustand sein. Wenn die FragmentActivity ausgeführt wird onCreate und finish() aufgerufen wird, ist die Absicht, dass die FragmentActivity Einstellung beendet und beendet. Die visuelle Erfahrung ist, dass dies auftritt, aber es scheint, als ob die FragmentManager es selbst übernimmt, den Lebenszyklus für vorher existierende Fragment s, Albiet mit einigen kurzen Kürzungen fortzusetzen. Dieser Prozess scheint die Lifecycle-Methoden bis zu onActivityCreated auszuführen und dann onDestroy und onDetach auszuführen und dazwischen zu überspringen.

Der beste Weg, damit umzugehen, scheint zu sein, die sekundären Probleme (in diesem Fall Ihre NPE) zu behandeln, die von diesem Start verursacht werden. Es scheint so, als wäre es möglich, dies aus dem Fragment Lebenszyklus zu optimieren, aber mit der r12 Support-Bibliothek scheint die Situation eine Konsequenz des Designs zu sein.

+0

Ich habe auch genau dasselbe Verhalten bemerkt. Ich warte jedoch auf eine Antwort, die alle Punkte zusammenfassen kann. Vielen Dank, das kann wirklich hilfreich für andere sein und Ja, ich habe diese NPE bereits gelöst und das hat dieses seltsame Problem gelöst. Dies ist sicherlich nicht von Android Jungs erwartet ... – aProgrammer

+0

Vielen Dank für diese Erklärung. Ein paar Jahre später scheint diese Logik leider immer noch dieselbe zu sein. –

Verwandte Themen