18

Ho un FragmentActivity (Frammenti di supporto) dove creo Frammenti per codice e li metto in FrameLayouts. Funziona tutto bene finora. Ora se lascio l'App un ritorno tutto va bene fintanto che il sistema non uccide la mia attività (o lo faccio con il pulsante stop in DDMS). Se ciò accade, non viene chiamato e la mia attività viene uccisa. onDestroy non viene chiamato.I frammenti rimangono dopo che Activity viene ucciso e ricreato

Così quando riapro la mia app ancora esistono tutti i frammenti e ottengo NullPointerExeptions perché cercano di fare il loro lavoro. I Frammenti non dovrebbero esistere in questo stato dell'App, quindi questo è un problema per me.

Non ho bisogno di loro nel backStack, quindi non li metto lì e non posso chiamare popBackStack() per sbarazzarsi di loro.

Come posso ripristinare FragmentManager in onCreate() o semplicemente assicurarsi che anche i Frammenti vengano distrutti?

+0

hai trovato la soluzione per questo? – Henry

risposta

0

Non sono sicuro se si tratti dello stesso problema, ma qualche tempo fa ho avuto un problema con i frammenti in un viewpager in cui i metodi del ciclo di vita dei frammenti non sono mai stati chiamati e il problema era con il gestore dei frammenti.

Quindi, provare a utilizzare childFragmentManager anziché supportFragmentManager e vedere se risolve il problema.

+0

Se la tua attività viene uccisa, onDestroy viene chiamato. E sono abbastanza sicuro che quando la tua attività viene uccisa, i frammenti vanno con esso. Cosa ti fa pensare che la tua attività venga uccisa? Sei sicuro che non ci sia nulla che mantenga riferimenti ai tuoi frammenti? – Christine

+0

Il problema è che onDestroy non viene chiamato di sicuro. Ma quando onCreate è chiamato so che è stato distrutto. Tutti i miei riferimenti sono nell'attività distrutta, quindi no. – Towlie288

+0

Non si può assolutamente contare su onDestroy() per ricevere chiamate, e ci sono possibili effetti collaterali come la gestione per mantenere onDestroy() dalla finitura. Può essere un disastro –

2

Questo potrebbe essere normale. Invece di istanziare e distruggere molti frammenti, Android potrebbe tenerli in giro. Questo accade soprattutto con ViewPager.

Stai utilizzando molte chiamate o chiamate getActivity() per ottenere il contesto? Se è così, nulla controlla la chiamata getActivity() facendo qualcosa di semplice come

Activity activity = getActivity(); 
if (activity == null) 
{ 
    Log.w("activity null!", "This will cause a crash if you access this variable!"); 
} 

Un altro suggerimento sarebbe quello di guardare fuori per AsyncTasks. Se si dispone di uno di questi in esecuzione in background, si vorrebbe tenere traccia se l'attività è vivo o morto. Penso che ci siano controlli del ciclo di vita inseriti nelle versioni successive di Android, ma puoi anche tenere un flag booleano su onAttach() e onDetach().

3

Il frammento lifecycle è simile al ciclo di vita dell'attività in modo che possa essere ucciso e ricreato dal sistema in modo da risparmiare memoria per altre app. Ciò significa che esiste un meccanismo per salvare e ripristinare lo stato del frammento. Dovresti usarlo.

Se è impossibile salva lo stato del frammento (dato che i suoi dati sono dinamici e non serializzabili), prova ad implementare alcuni comportamenti di default per lo stato non inizializzato.

3

so che è davvero tardi, ma ho lo stesso problema e ho trovato le risposte qui

support FragmentPagerAdapter holds reference to old fragments

e qui

ViewPager and fragments — what's the right way to store fragment's state?

Credo che il problema è che quando crei attività che crei e salvi frammenti in alcuni elenchi e non in framment menager. Quando l'attività viene creata nuovamente crea anche un frammento ma il gestore frammenti utilizza il frammento creato in precedenza. In questo modo il frammento restituisce null per getActivity() perché questo frammento è quello creato prima di mettere l'app in background.

+2

Nota che [risposte solo per collegamento] (http://meta.stackoverflow.com/tags/link-only-answers/info) sono scoraggiate, quindi le risposte dovrebbero essere il punto finale di una ricerca per una soluzione (rispetto a un'altra sosta di riferimenti, che tende a diventare obsoleta nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

+1

Questi link spiegano molto dettagliatamente. Grandi risposte – Smeet

Problemi correlati