0

以下是我的堆栈跟踪:

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

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

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

4

1 回答 1

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

然后在你的回调中,你可以通过一个可运行的来传递事务代码,executeOnResume而不是直接调用。

someAsyncTask(new Callback() {
    void call() {
        // do common stuff.

        executeOnResume(new Runnable() {
            void run() {
                // fragment transaction
            }
        })
    }
}
于 2016-08-06T03:37:21.263 回答