【发布时间】:2017-05-10 00:49:07
【问题描述】:
抱歉,这是一篇比较长的帖子,让我先解释一下背景:
我已经阅读了很多关于这个主题的帖子(以及关于这个主题的Alex's excellent blog post),一般的结论似乎是不在异步回调中执行片段事务(参见Dianne's post),比如AsyncTask#onPostExecute() .
但是我有 2 种情况需要这样做:
一个
Activity显示一个登录Fragment,当用户按下登录按钮时,一个AsyncTask开始与服务器进行身份验证,然后当返回登录成功时,登录Fragment被替换为主应用Fragment。-
显示主应用程序片段的
Activity,当用户触发一些需要登录的操作时,登录片段替换添加到后台堆栈的主片段。再次按下登录按钮时,AsyncTask与服务器进行身份验证,然后当登录成功时,我们想要弹出回栈以向用户显示主要的Fragment,并让他们执行他们想要执行的操作。
案例 1 可以使用 commitAllowingStateLoss 解决,但案例 2 很棘手,因为在 FragmentManager 中没有 popBackStack 的这种味道。
无论如何,这两种情况都需要在AsyncTask#doInBackground() 期间对应用程序进入后台进行特殊处理,从而导致onPostExecute() 在应用程序处于后台时被调用。一种解决方案是使用 Fragment.isResumed 来保护替换片段或弹出回栈,然后通过再次登录或保存一些指示最近成功登录的标志来处理进程终止情况,并在应用恢复状态下替换/弹出登录片段(登录@987654336 @ 由FragmentManager 恢复到顶部)。或者允许状态丢失,并处理进程被杀死然后恢复的情况,检查最近登录并删除登录片段。
你会这样处理吗?仅仅为了处理一个非常常见的情况,感觉就需要做很多工作。
【问题讨论】:
-
'感觉就像处理一个非常常见的情况需要做很多工作。'是的你是对的。我在一个应用程序中遇到了同样的问题。但作为替代方案,我建议您在活动中拆分主要片段和登录片段。这将简化处理此屏幕之间的转换。
-
谢谢,有另一个登录活动可以为手机解决这个问题,但想象一下平板电脑 2 窗格布局(导航窗格和内容窗格),其中登录将内容窗格替换为片段,无法使用在这种情况下的活动:(
标签: android android-fragments android-activity illegalstateexception