如何在暂停时处理AsyncTask onPostExecute以避免IllegalStateException

PJL*_*PJL 37 android android-lifecycle android-asynctask android-fragments

我很欣赏有关轮换更改的AsyncTask的大量帖子.使用兼容性lib并试图解雇DialogFragmentin 时,我有以下问题onPostExecute.

我有一个片段,它触发AsyncTask显示进度DialogFragment,然后onPostExecute解散对话框然后可能抛出另一个DialogFragment.

如果在显示进度对话框时我把应用程序放到后台我得到了以下片段:

1) onPause

2) onSaveInstanceState

3)onPostExecute我尝试解雇并调用对话框.

我得到一个IllegalStateException因为我正在尝试在活动保存状态时有效地提交事务并且我理解这一点.

在轮换中,我假设(可能不正确)onPostExecute在重新创建活动之前我不会得到.但是,当把应用程序放到后台时,我假设(肯定是错误的)onPostExectute在片段/活动暂停时不会被调用.

我的问题是,我的解决方案是简单地检测onPostExecute到片段/活动暂停并简单地执行我需要做的事情onResume吗?对我来说似乎有些难看.

提前谢谢,彼得.

编辑1

需要支持2.1及以上版本

编辑2

我已经考虑过使用对话框FragmentTransaction:add,FragmentTransaction:commitAllowingStateLoss但这并非没有问题.

Mal*_*olm 16

如果您需要将任务与活动生命周期同步,我相信Loaders正是您所需要的.更具体地说,您应该使用AsyncTaskLoader来完成这项工作.因此,现在不是运行AsyncTask,而是启动加载器,然后等待侦听器中的响应.如果活动暂停,您将无法收到回叫,此部分将为您管理.

还有另一种方法可以处理此任务:使用保留其实例的片段.一般的想法是你创建一个没有UI和调用的片段setRetainInstance(true).它有一个任务,正在通知可用或不可用的活动.如果没有,任务的线程将暂停,直到活动可用.


qui*_*raw 8

实现所需内容的另一种方法是实现我在本文中记录的PauseHandler类.

然后在你的onPostExecute方法中调用sendMessage()将你的消息发布到处理程序中.

当您的应用程序恢复时,将处理该操作.