2015-06-09 9 views
6

मुझे बैक स्टैक से सभी टुकड़े साफ़ करने की आवश्यकता है।इंटरमीडिएट टुकड़े को फिर से शुरू किए बिना एंड्रॉइड फ्रैगमेंट बैक स्टैक को कैसे साफ़ करें

समस्या यह है कि मुझे कुछ समय पर सुनिश्चित करने की ज़रूरत है, ढेर को सफलतापूर्वक मंजूरी दे दी गई है और बाद में किसी भी पॉप-अप टुकड़े को फिर से शुरू नहीं किया जाएगा।

कुछ टुकड़े वर्तमान में साइन इन किए गए उपयोगकर्ता से संबंधित सामग्री प्रदर्शित करते हैं। अब यदि उपयोगकर्ता साइन आउट करने का निर्णय लेता है, तो मैं स्टैक साफ़ करना चाहता हूं, उपयोगकर्ता को साइन आउट करना चाहता हूं और ऐप को प्रारंभिक खंड में बदलना चाहता हूं। समस्या यह है कि, स्टैक पॉप स्थगित कर दिया गया है और जब मैं साइन आउट करता हूं, तो कुछ उपयोगकर्ता संबंधित खंड फिर से शुरू करने और उपयोगकर्ता प्रोफ़ाइल डेटा के लिए पूछने का प्रयास करते हैं। और अगर अंतर्निहित उपयोगकर्ता कोई हस्ताक्षरित नहीं है तो अंतर्निहित एपीआई अपवाद फेंकता है। तो टुकड़ा दुर्घटनाग्रस्त हो जाता है क्योंकि इस तरह के राज्य में इसका उपयोग नहीं किया जाना चाहिए।

मैं कई मायनों की कोशिश की है:

@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(); 
} 

या

@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(); 
} 

लॉग पता चलता है कि टुकड़ा अभी भी अपने जीवन चक्र के तरीकों संसाधित कर रहा है जब मैं UserProfileService.signOut फोन()। AsyncTask जो खंडों में से किसी एक के लिए प्रोफाइल डेटा पुनर्प्राप्त करता है, खंड को रोक दिया जाता है जब (अवरोध के साथ) रद्द कर दिया जाता है। लेकिन टुकड़ा बहुत देर हो चुकी है।

और त्रुटि हमेशा हिट नहीं होती है। लेकिन ज्यादातर बार यह सैमसंग एस 2 (एंड्रॉइड 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 नीचे स्क्रॉल करें, जाँच "जीवन चक्र" ग्राफिक और टुकड़ा में 4 कॉलबैक ध्यान दें जब यू इसे फिर से शुरू करें - जहां आप इस तथ्य को पकड़ सकते हैं कि "CURRENT-USER" –

+0

नहीं है लेकिन मैं प्रत्येक टुकड़े में असामान्य स्थिति से निपटना नहीं चाहता हूं। यह अनावश्यक कोड के साथ कई टुकड़ों को प्रदूषित करेगा। – aguyngueran

उत्तर

-1

इस प्रयास करें:

private void clearFragmentBackStack() { 
    FragmentManager fm = getSupportFragmentManager(); 
    for(int i = 0; i < fm.getBackStackEntryCount(); ++i) { 
     fm.popBackStack(); 
    } 
} 
संबंधित मुद्दे