2015-06-09 12 views
6

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 
+0

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" –

+0

Ma non voglio occuparmi della situazione anomala in ogni singolo frammento. Inquina molti frammenti con codice non necessario. – aguyngueran

risposta

-1

Prova questo:

private void clearFragmentBackStack() { 
    FragmentManager fm = getSupportFragmentManager(); 
    for(int i = 0; i < fm.getBackStackEntryCount(); ++i) { 
     fm.popBackStack(); 
    } 
} 
Problemi correlati