我找不到任何解决方案能够满足我所有的要求。
在我的应用程序中,我使用 AsyncTasks
执行一些操作,例如将数据保存到内存或从数据库读取数据。我在 onPreExecute
中创建进度对话框,在 onProgressUpdate
中更新进度值,并在 onPostExecute
中关闭对话框。
最近我切换到 Fragment API(我使用支持库来针对旧版本的 Android),这意味着我的活动子类化了 FragmentActivity
,而对话框则子类化了 DialogFragment
。
切换到 Fragment API 导致一个众所周知的问题 - 有时我会遇到以下异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
例如,当用户启动后台操作(进度对话框出现),使用主页按钮最小化应用程序并在活动处于后台时完成操作时,就会发生这种情况。然后应用程序尝试解除对话框,但由于活动的状态已保存,因此失败了。
我理解这个问题。可以通过确保将对UI的更改推迟到恢复活动时来修复它,如本文所述:如何处理活动/片段暂停时的处理程序消息。
然而,这种解决方案会导致另一个问题。如果操作在活动处于后台时完成,稍后Android杀死了该活动,那么怎么办?当用户返回应用程序时,它会恢复其保存在
onSaveInstanceState
中的状态。因此,进度对话框仍然可见,并显示与活动放入后台时相同的进度值。应该解除它的消息从未被处理,当活动被杀死时就丢失了。如何正确解决所有描述的问题?如何允许在活动处于后台时更改UI,或者至少允许推迟UI更改并确保它们不会在Android杀死活动时丢失?该解决方案必须允许跟踪后台任务的进度。
DialogFragment
在Fragment
重新实例化时被恢复,则只需检查操作是否仍在运行,如果没有,则关闭DialogFragment
。如果您没有持久化您的任务,那么在进程重新启动后无论如何都不会运行。 - corsair992