抱歉,这是一篇相当长的文章,让我先尝试解释一下背景:
我已经阅读了很多关于这个主题的文章(以及关于这个主题的 Alex's excellent blog post),一般的结论似乎不是在异步回调中执行 fragment 事务(参见 Dianne's post),比如 AsyncTask#onPostExecute()
。
但是我有 2 种情况需要这样做:
Activity
显示登录Fragment
,当用户按下登录按钮时,AsyncTask
开始与服务器进行身份验证,然后当返回登录成功时,登录Fragment
将替换为主应用Fragment
。显示主应用程序 fragment 的
Activity
,当用户触发某些需要登录的操作时,登录 fragment 会替换添加到后台堆栈的主 fragment 。再次按下登录按钮时,AsyncTask
向服务器进行身份验证,然后当登录成功时,我们想要弹出后台堆栈以向用户显示主要的Fragment
并让他们执行他们想要执行的操作。
情况 1 可以通过使用 commitAllowingStateLoss
来解决,但是情况 2 很棘手,因为 FragmentManager
中没有这种 popBackStack 的风格。
在任何情况下,这两种情况都需要在 AsyncTask#doInBackground()
期间对进入后台的应用进行特殊处理,从而导致 onPostExecute()
在应用处于运行状态时被调用背景。一种解决方案是使用 Fragment.isResumed 来保护替换 fragment 或弹出后台堆栈,然后通过再次登录或保存一些指示最近成功登录的标志来处理进程终止情况,并在应用程序恢复状态时替换/弹出登录 fragment (登录 Fragment
由 FragmentManager
恢复到顶部)。或者允许状态丢失,并处理进程被杀死然后恢复的情况,检查最近的登录并删除登录 fragment 。
你会这样处理吗?处理一个非常普遍的情况感觉就像做很多工作。
最佳答案
最近的解决方法是在 popBackStack()
之前调用 FragmentActivity.onStateNotSaved()
。
关于android - onPostExecute 中的 popBackStack 导致 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779139/