2015-06-09 16 views
6

Tôi cần xóa tất cả các đoạn khỏi ngăn xếp sau.Cách xóa ngăn xếp phân đoạn Android mà không cần khôi phục các đoạn trung gian

Vấn đề là tôi cần đảm bảo tại một thời điểm nào đó, ngăn xếp đã được xóa thành công và không có đoạn nào sau đó được phục hồi lại.

Một số đoạn hiển thị nội dung liên quan đến người dùng hiện đã đăng nhập. Bây giờ nếu người dùng quyết định đăng xuất, tôi muốn xóa ngăn xếp, đăng xuất người dùng và chuyển ứng dụng sang đoạn ban đầu. Vấn đề là, ngăn xếp pop được hoãn lại và sau khi tôi đăng xuất, một số đoạn liên quan đến người dùng cố gắng tiếp tục và yêu cầu dữ liệu hồ sơ người dùng. Và API cơ bản ném ngoại lệ nếu không có người dùng đã đăng nhập. Vì vậy, các mảnh vỡ do nó không nên được sử dụng trong trạng thái như vậy.

Tôi đã thử nhiều cách:

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

hoặc

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

Nhật ký tiết lộ rằng đoạn còn đang xử lý phương pháp vòng đời của nó khi tôi gọi UserProfileService.signOut(). AsyncTask truy xuất dữ liệu hồ sơ cho một trong các đoạn bị hủy (với ngắt) khi đoạn bị tạm dừng. Nhưng đoạn bị tạm dừng quá muộn.

Và lỗi không phải luôn xảy ra. Nhưng phần lớn số lần truy cập trên 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 Cuộn xuống, kiểm tra "vòng đời" đồ họa và lưu ý 4 callbacks trong đoạn khi u tiếp tục nó - nơi bạn có thể nắm bắt được thực tế rằng không có "CURRENT-USER" –

+0

Nhưng tôi không muốn đối phó với tình huống bất thường trong từng mảnh. Nó sẽ gây ô nhiễm nhiều mảnh với mã không cần thiết. – aguyngueran

Trả lời

-1

Hãy thử điều này:

private void clearFragmentBackStack() { 
    FragmentManager fm = getSupportFragmentManager(); 
    for(int i = 0; i < fm.getBackStackEntryCount(); ++i) { 
     fm.popBackStack(); 
    } 
} 
Các vấn đề liên quan