我开发了一个应用程序,但是用户说明应用程序在特定部分崩溃了,我怀疑是罪魁祸首的代码可以在下面找到,但为您提供一些上下文。我有一个片段管理器作为向导,最后一个片段是一个提交按钮,点击后,“处理”所有寻呼机片段的数据,然后重定向到确认片段,所有这些都发生在提交按钮之后单击是在异步任务中完成的。此外,如果有任何后果,我在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();
}
答案 0 :(得分:1)
我猜这可能是什么,特别是如果它很难再现。问题在于,在异步回调之后,您正在执行FragmentTransaction
,在此期间可能发生任何数量的事情。因此,您无法保证您在活动生命周期中的位置。问题是碎片和国家损失。
http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
https://stackoverflow.com/a/17527246/1856960
比如说,用户启动AsyncTask,然后结束Activity,启动另一个,或点击主页按钮。所有这些都会将活动置于后台,并可能触发对onSaveInstanceState
的调用。 在调用onSaveInstanceState 后,您无法提交片段事务。这是因为FragmentManager
以及与之关联的所有状态已经捆绑在onSaveInstanceState
中,因此如果活动被销毁并重新创建,您将丢失碎片事务。
至于解决问题,我希望我有一个很好的建议。您可以查看FragmentTransaction#commitAllowingStateLoss
,但只有在您确定潜在的失败不会对您的应用程序产生负面影响时才应该使用此选项。有关详细信息,请参阅上面的链接。