2013-03-05 13 views
7

Oggi ho notato uno strano comportamento nella mia applicazione.Il frammento suActivityCreated() viene chiamato dopo onDestroy() dell'attività

Accade quando interrompo la mia applicazione utilizzando la vista Dispositivi da Eclipse. Qualcuno può spiegarlo?

Perchédi Fragment chiamato anche se Activity è già stato distrutto? MyHomeActivity contiene due Fragment s e viene generato un registro simile per entrambi.

Qui sto incollando i registri per uno Fragment. NullPointerException è un problema secondario.

Sono sorpreso del motivo per cui lo onActivityCreated() viene chiamato quando lo stack di chiamate è stato avviato da onDestroy() di MyHomeActivity?

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) 

Sto usando libreria di supporto per fornire Fragment s pre-Honeycomb dispositivi, se questo fa alcuna differenza.

+0

Sembra che tu abbia eseguito l'override del callback 'onDestroy'. Che stai facendo li? – Luksprog

+0

niente solo chiamando super.OnDestroy() – aProgrammer

+0

Ho appena notato questo stesso comportamento sul mio emulatore 4.2. Hai trovato più informazioni? –

risposta

14

Dopo qualche test e verifica FragmentManager.moveToState, credo che quando il Fragment viene gestita da un FragmentPagerAdapter, è inevitabile che un Fragment che in precedenza era fusero in savedState (come parte del processo di fermare l'applicazione prima di uccidere il elaborare dalla scheda DDMS in eclissi), deve prima essere "creato" (nella terminologia di FragmentManager) prima che possa essere distrutto.

Questa potrebbe essere una conseguenza non intenzionale del processo di ricostruzione dei frammenti dallo stato salvato. Quando viene eseguito il FragmentActivityonCreate e finish(), l'intenzione è che FragmentActivity interrompa la configurazione e l'uscita. L'esperienza visiva è che ciò si verifica, ma sembra che lo FragmentManager si prenda da solo per continuare il ciclo di vita per gli Fragment s esistenti, albiet con alcune scorciatoie. Questo processo sembra eseguire i metodi del ciclo di vita fino a onActivityCreated e quindi eseguire onDestroy e onDetach, saltando quelli in mezzo.

Il modo migliore per gestire questo sembra essere quello di risolvere i problemi secondari (in questo caso, il tuo NPE) causati da questo avvio. Sembra che ci sarebbe spazio per ottimizzare questo ciclo di vita Fragment, ma con la libreria di supporto r12, la situazione sembra essere una conseguenza del progetto.

+0

Ho anche notato esattamente lo stesso comportamento. Tuttavia stavo aspettando una risposta che potesse mettere insieme tutti i punti. Grazie mille questo può essere davvero utile per gli altri e Sì, ho già risolto NPE e questo ha risolto questo strano problema. Questo non è certamente previsto da ragazzi Android ... – aProgrammer

+0

Grazie per questa spiegazione. Un paio d'anni dopo, questa logica sembra essere ancora la stessa, sfortunatamente. –

Problemi correlati