1

我开发了一个应用程序,但用户说应用程序在特定部分崩溃,我怀疑是罪魁祸首的代码可以在下面找到,但为您提供一些上下文。我有一个充当向导的片段管理器,最后一个片段上是一个提交按钮,单击该按钮时,“处理”来自所有寻呼机片段的数据,然后重定向到确认片段,所有这些都发生在提交按钮之后单击是在异步任务中完成的。此外,如果有任何后果,我会在 AsyncTask 运行时运行一个进度对话框。

//Called from Async Task's "onPostExecute()"
private void callback()
{
    FragmentManager fragmentManager = getActivity()
            .getSupportFragmentManager();

    fragmentManager.popBackStack("fraud_report", FragmentManager.POP_BACK_STACK_INCLUSIVE);

    Fragment f =  new CompletedFragment();

    Bundle args = new Bundle();

    args.putString("id", reportToSubmit.getReferenceId());

    f.setArguments(args);

    fragmentManager.beginTransaction()
            .replace(R.id.content_frame, f, "completed").commit();

    fragmentManager.executePendingTransactions();


}
4

1 回答 1

1

我猜想这可能是什么,特别是如果它难以重现的话。您的问题是您正在执行FragmentTransaction异步回调之后,在此期间可能会发生任何数量的事情。因此,您无法保证您将处于活动生命周期中的哪个位置。问题是碎片和状态损失。

http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

https://stackoverflow.com/a/17527246/1856960

例如,用户启动 AsyncTask,然后结束 Activity,启动另一个,或者点击主页按钮。所有这些都会将 Activity 置于后台,并可能触发对onSaveInstanceState. 在调用 onSaveInstanceState 之后,您不能提交 Fragment Transaction。这是因为FragmentManager和它相关的所有状态都已经被捆绑到了onSaveInstanceState,所以如果 Activity 被销毁并重新创建,你将丢失你的 Fragment Transaction。

至于解决这个问题,我希望我对你有一个好的建议。您可以查看,FragmentTransaction#commitAllowingStateLoss但只有在您确定潜在的失败不会对您的应用程序产生负面影响时才应该使用它。有关更多信息,请参阅上面的链接。

于 2014-05-07T13:40:38.717 回答