在onSaveInstanceState之后无法执行此操作

时间:2016-08-01 09:11:05

标签: android-fragments android-fragmentactivity android-savedstate

以下是我的堆栈跟踪:

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

此处对话框是一个包含视图寻呼机的片段。

这个问题只出现过一次。让我知道如何解决它。

1 个答案:

答案 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
            }
        })
    }
}