Ho bisogno di cancellare tutti i frammenti dallo stack posteriore.Come cancellare lo stack posteriore di frammenti Android senza riprendere i frammenti intermedi
Il problema è che ho bisogno di assicurarmi che in un certo momento, lo stack è stato cancellato con successo e nessuno dei frammenti di schiocco indietro verrà ripreso in seguito.
Alcuni frammenti visualizzano il contenuto che è correlato all'utente attualmente connesso. Ora se l'utente decide di uscire, vorrei cancellare lo stack, disconnettere l'utente e passare l'app al frammento iniziale. Il problema è che lo stack pop viene rinviato e dopo che esci, alcuni frammenti relativi all'utente cercano di riprendere e chiedere i dati del profilo utente. E l'API sottostante genera un'eccezione se non ci sono utenti registrati. Quindi il frammento si blocca in quanto non dovrebbe essere usato in tale stato.
Ho provato molti modi:
@Override
public void onSignOutConfirmed() {
Log.d(TAG, "onSignOutConfirmed");
getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Log.d(TAG, "onSignOutConfirmed - signing out");
UserProfileService.signOut();
Analytics.trackEvent(EventType.SIGN_OUT);
showStartupScreen();
}
o
@Override
public void onSignOutConfirmed() {
Log.d(TAG, "onSignOutConfirmed");
FragmentManager fm = getSupportFragmentManager();
int backStackCount = fm.getBackStackEntryCount();
while(backStackCount-- != 0) {
fm.popBackStackImmediate();
}
Log.d(TAG, "onSignOutConfirmed - signing out");
UserProfileService.signOut();
Analytics.trackEvent(EventType.SIGN_OUT);
showStartupScreen();
}
Il log rivela che il frammento è ancora elaborando suoi metodi ciclo di vita quando chiamo UserProfileService.signOut(). Il AsyncTask che recupera i dati del profilo per uno dei frammenti viene annullato (con interrupt) quando il frammento viene messo in pausa. Ma il frammento è stato messo in pausa troppo tardi.
E l'errore non colpisce sempre. Ma la maggior parte delle volte colpisce Samsung S2 (Android 4.1.2).
06-09 19:46:54.760 D/com.myapp.application.MainActivity(4562): **onSignOutConfirmed**
06-09 19:46:54.765 D/com.myapp.application.screens.main.MainFragment(4562): onCreateView
06-09 19:46:54.826 D/com.myapp.application.screens.main.MainFragment(4562): onCreateAnimation (transit 0, enter true, nextAnim 0)
06-09 19:46:54.831 D/com.myapp.application.screens.main.TranscriptionsFragment(4562): onCreateView
06-09 19:46:54.856 D/com.myapp.application.screens.main.MainFragment(4562): onResume
06-09 19:46:54.856 D/com.myapp.application.screens.main.TranscriptionsFragment(4562): **onResume**
06-09 19:46:54.866 D/com.myapp.application.MainActivity(4562): **onSignOutConfirmed - signing out**
06-09 19:46:54.876 D/myappDB(4562): Application settings: id 1.
06-09 19:46:54.876 D/myappDB(4562): Application settings (id 1): updated, [_activeProfileId] = [null].
06-09 19:46:54.916 D/myappDB(4562): Application settings: active user profile null.
06-09 19:46:54.941 D/myappDB(4562): Application settings: active user profile null.
06-09 19:46:54.951 D/com.myapp.application.screens.main.TranscriptionsFragment(4562): **onPause**
06-09 19:46:54.951 D/com.myapp.application.screens.main.MainFragment(4562): onPause
06-09 19:46:54.961 D/com.myapp.application.screens.main.TranscriptionsFragment(4562): onDestroyView
06-09 19:46:54.961 D/com.myapp.application.screens.main.MainFragment(4562): onDestroyView
06-09 19:46:54.961 D/com.myapp.application.screens.main.MainFragment(4562): onCreateAnimation (transit 0, enter false, nextAnim 0)
06-09 19:46:55.381 E/AndroidRuntime(4562): at com.myapp.application.impls.sqlite.SQLiteApplicationSettingsPersistance.getAndCheckActiveUserProfileId(SQLiteApplicationSettingsPersistance.java:421)
06-09 19:46:55.381 E/AndroidRuntime(4562): at com.myapp.application.impls.sqlite.SQLiteTranscriptionPersistance.getTranscriptionStats(SQLiteTranscriptionPersistance.java:54)
06-09 19:46:55.381 E/AndroidRuntime(4562): at com.myapp.application.impls.finders.TranscriptionListFinder.getTranscriptions(TranscriptionListFinder.java:45)
06-09 19:46:55.381 E/AndroidRuntime(4562): at com.myapp.application.screens.main.TranscriptionsFragment$RetrieveTranscriptionsAsyncTask.doInBackground(TranscriptionsFragment.java:244)
06-09 19:46:55.381 E/AndroidRuntime(4562): at com.myapp.application.screens.main.TranscriptionsFragment$RetrieveTranscriptionsAsyncTask.doInBackground(TranscriptionsFragment.java:241)
06-09 19:46:55.421 D/com.myapp.application.screens.main.TranscriptionsFragment(4562): onDetach
http://developer.android.com/guide/components/fragments.html scorrere verso il basso, controllare grafica del "ciclo di vita" e nota 4 callback nel frammento quando u riprenderlo - dove è possibile rilevare il fatto che non esiste "CURRENT-USER" –
Ma non voglio occuparmi della situazione anomala in ogni singolo frammento. Inquina molti frammenti con codice non necessario. – aguyngueran