android - onPostExecute 中的 popBackStack 导致 IllegalStateException

标签 android android-fragments android-activity illegalstateexception

抱歉,这是一篇相当长的文章,让我先尝试解释一下背景:

我已经阅读了很多关于这个主题的文章(以及关于这个主题的 Alex's excellent blog post),一般的结论似乎不是在异步回调中执行 fragment 事务(参见 Dianne's post),比如 AsyncTask#onPostExecute()

但是我有 2 种情况需要这样做:

  1. Activity 显示登录 Fragment,当用户按下登录按钮时,AsyncTask 开始与服务器进行身份验证,然后当返回登录成功时,登录 Fragment 将替换为主应用 Fragment

  2. 显示主应用程序 fragment 的 Activity,当用户触发某些需要登录的操作时,登录 fragment 会替换添加到后台堆栈的主 fragment 。再次按下登录按钮时,AsyncTask 向服务器进行身份验证,然后当登录成功时,我们想要弹出后台堆栈以向用户显示主要的 Fragment 并让他们执行他们想要执行的操作。

情况 1 可以通过使用 commitAllowingStateLoss 来解决,但是情况 2 很棘手,因为 FragmentManager 中没有这种 popBackStack 的风格。

在任何情况下,这两种情况都需要在 AsyncTask#doInBackground() 期间对进入后台的应用进行特殊处理,从而导致 onPostExecute() 在应用处于运行状态时被调用背景。一种解决方案是使用 Fragment.isResumed 来保护替换 fragment 或弹出后台堆栈,然后通过再次登录或保存一些指示最近成功登录的标志来处理进程终止情况,并在应用程序恢复状态时替换/弹出登录 fragment (登录 FragmentFragmentManager 恢复到顶部)。或者允许状态丢失,并处理进程被杀死然后恢复的情况,检查最近的登录并删除登录 fragment 。

你会这样处理吗?处理一个非常普遍的情况感觉就像做很多工作。

最佳答案

最近的解决方法是在 popBackStack() 之前调用 FragmentActivity.onStateNotSaved()

关于android - onPostExecute 中的 popBackStack 导致 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779139/

相关文章:

android - 何时手动附加/分离 Android fragment ?

android - 检查 Activity 是否从 Service 运行

android - 如何使用 setcontent 通过按钮更改内容 View

android - 如何在模拟器中运行安卓应用程序?

android - AppCompat 抽屉导航不让我关注任何 EditText

java - 服务器响应是 : Bad Request: 400 in httpurlconnection

android - 为什么我会收到 Error inflating class fragment?

java - 从另一个类调用 'requestWindowFeature'

Android SDK Manager 无法下载新文件

android - ScrollView 内的 MapView 不显示缩放控件