以下是我的堆栈跟踪:
Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
这是我的代码:
dialog = FeedDialog.getInstance(feedViewModels, this, false, this);
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager != null && !isFinishing()) {
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.fragment_content, dialog);
ft.addToBackStack("unread_feeds");
ft.commit();
fragmentManager.executePendingTransactions();
}
此处对话框是一个包含视图寻呼机的片段。
这个问题只出现过一次。让我知道如何解决它。
答案 0 :(得分:0)
IllegalStateException
。
出现这种情况时,一种非常常见的方式是调用网络调用,并在回调中触发片段事务。如果在网络呼叫完成时应用程序最小化,您应该获得IllegalStateException
。
我认为您应该在某些异步回调中执行此事务。
解决方案是在执行事务之前添加isResumed()
检查。如果isResumed()
返回false,则需要将事务排队以在应用程序恢复后进行。您可以在Fragment(或BaseFragment)中使用一个辅助方法来维护Runnable
个对象的列表,并在onResume
中执行它们。
List<Runnable> pendingJobsOnResume;
public void executeOnResume(Runnable runnable) {
if (isResumed()) {
runnable.run();
} else {
pendingJobsOnResume.add(runnable);
}
}
// And invoke them in onResume
void onResume() {
super.onResume();
for (Runnable runnable : pendingJobsOnResume) {
runnable.run();
}
pendingJobsOnResume.clear();
}
然后在回调中,您可以将事务代码通过runnable传递给executeOnResume
,而不是直接调用。
someAsyncTask(new Callback() {
void call() {
// do common stuff.
executeOnResume(new Runnable() {
void run() {
// fragment transaction
}
})
}
}