2012-08-10 148 views
17

我有我的應用程序汽車無在活動中的某些用戶除了具有以下不同的設備崩潰OnStart方法的一個嚴重問題:IllegalStateException異常 - 片段支持庫

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) 
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 

我不能在我的模擬器本地重現此錯誤。我發現關於在計算器這個問題有幾個問題: herehere

我已經嘗試了建議的解決方案,即不允許在onSaveInstance空束既不片段,也不活動。

但問題依然存在。這是我獲得的唯一崩潰報告,我不斷得到它。

有沒有人有工作解決方案?

回答

4

我解決了這個使用this workaround,即把代碼放到一個方法onPostResume()功能在活動

+0

它工作嗎,有什麼問題嗎? – 2013-02-16 22:47:56

+0

反對:onPostResume不適用於android.support.v4.app.Fragment – Loda 2014-05-02 12:33:52

+1

@Loda它是在android.support.v4.app.FragmentActivity,而不是片段 – CACuzcatlan 2015-05-27 19:00:01

-1

Read This Article.

而且,

This one.

一旦問題了解,請繼續並正確地更改內容:

Fig排除爲什麼您的交易發生在您的onResume狀態之外。爲什麼這些事情發生時,他們不應該。爲什麼要手動添加和刪除與應用程序生命週期有關的碎片,而不是在用戶請求時添加和刪除碎片。你可能需要一次在onCreate()或者當用戶調用一些東西。但是,爲什麼你首先在onResume()中搞亂了它們?不要這樣做。

如果您將所有.commit()更改爲.commitAllowStateLoss()那麼崩潰將消失。但是,你最好不要那樣做。除非應用程序完全運行,否則最好不要更改碎片。有時這意味着永遠不會從OnActivityResult()加載片段,而是在onPostResume()中運行標記,並避免在異步線程中執行UI更改,這會錯誤地假定您不能在此期間中止活動。

如果你只是想刪除一切,.commitAllowStateLoss()將做到這一點。如果你想做的對,請確保在事情死亡後不要撥弄碎片。

我認爲最近的一種Android系統,大概是奧利奧,爲了避免這個令人討厭的錯誤,我改變了這種想法。我的答案似乎有點含糊,但這是因爲這個錯誤是在範式中。你完全可以用各種代碼元素來打這個,並且相當常規。

相關問題