【发布时间】:2014-08-01 19:18:07
【问题描述】:
我找不到任何满足我所有要求的解决方案。
在我的应用程序中,我使用AsyncTasks 执行一些操作,例如将数据保存到内存或从数据库中读取数据。我在onPreExecute 中创建一个进度对话框,在onProgressUpdate 中更新一个进度值并在onPostExecute 中关闭该对话框。
最近我切换到 Fragment API(我使用支持库来定位旧版本的 Android),这意味着我的活动子类 FragmentActivity 和对话框子类 DialogFragment。
切换到 Fragment API 导致了一个众所周知的问题 - 有时我会遇到以下异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
例如,当用户启动后台操作(出现进度对话框),使用主页按钮最小化应用程序并在活动处于后台时操作完成时,就会发生这种情况。然后应用程序尝试关闭对话框,但由于保存了活动的状态,因此失败了。
我理解这个问题。可以通过确保推迟对 UI 的更改直到活动恢复,如本文所述:How to handle Handler messages when activity/fragment is paused。
但是,这种解决方案会导致另一个问题。如果活动在后台时操作完成,然后活动被 Android 杀死怎么办?当用户导航回应用程序时,它会恢复其保存在onSaveInstanceState 中的状态。因此,进度对话框仍然可见,其进度值与将活动置于后台时相同。应该关闭它的消息从未被处理过,并且在 Activity 被终止时丢失了。
正确处理所有描述的问题的正确解决方案是什么?如何在活动处于后台时允许更改 UI,或者至少允许推迟 UI 更改并确保在活动被 Android 杀死的情况下它们不会丢失?该解决方案必须允许跟踪后台任务的进度。
【问题讨论】:
-
如果
DialogFragment在Fragment重新实例化后恢复,那么只需检查操作是否仍在运行,如果没有,则关闭DialogFragment。如果你没有持久化你的任务,那么在进程重启后它无论如何都不会运行。
标签: java android android-asynctask android-fragmentactivity