Android 在轮换期间保留AsyncTask,但在活动删除时不保留

Android 在轮换期间保留AsyncTask,但在活动删除时不保留,android,Android,我有一个运行简单异步任务的活动。为了在屏幕旋转期间保持AsyncTask运行,我使用OnRetainNonConfigurationInstance()将AsyncTask传递给新活动,正如线程的一个答案中建议的那样,然后我更新AsyncTask中指向该活动的指针,以确保它仍然可以从onProgressUpdate()更新进度对话框 我的问题是,使用此方法时,我无法检测活动是否仅旋转(在本例中,我希望继续运行AsyncTask),或者活动是否被Home按钮隐藏,在这种情况下,我希望停止Async

我有一个运行简单异步任务的活动。为了在屏幕旋转期间保持AsyncTask运行,我使用OnRetainNonConfigurationInstance()将AsyncTask传递给新活动,正如线程的一个答案中建议的那样,然后我更新AsyncTask中指向该活动的指针,以确保它仍然可以从onProgressUpdate()更新进度对话框

我的问题是,使用此方法时,我无法检测活动是否仅旋转(在本例中,我希望继续运行AsyncTask),或者活动是否被Home按钮隐藏,在这种情况下,我希望停止AsyncTask。但是,我可以检测back按钮的使用情况,因为在本例中,活动的isFinishing()返回true


是否有任何机制可以用来区分旋转和主页按钮的使用?

如果按主页按钮,则不应调用RetainingNonfigurationInstance()方法。因此,您可以使用一些布尔变量,将其在onRetainingNonfigurationInstance()中设置为
true
。然后,在
ondestory()
中,您可以检查变量,并在AsyncTask仍然为
false
时停止它

更新

我再次考虑了我的解决方案,经过一些搜索后,我认为它是错误的,因为如果按home按钮,onDestroy()将不会被调用。并且onStop()在onRetainingNonconfigurationInstance()之前被调用,因此如果您不知道这是否是一个配置更改,那么停止异步任务将很早


一个棘手的解决办法是在oStop()中调用AsyncTask的方法,该方法在AsynTask上初始化某种类型的自毁,如果是配置更改,则可以在OnRetainNonfigurationInstance()中再次停止。正如我所说,它不是很优雅。

我找到了一个非常优雅的解决方案,如何将AsyncTasks与ProgressDialogs结合使用。我现在不能说这是否符合你的情况。试试看。

您必须将其添加到清单中的活动声明中:

android:configChanges=“键盘隐藏|方向|屏幕大小”

旋转时,应保持所有活动不变


希望能有所帮助

谢谢你的建议,但我会等一等,看看是否有人提供了更“优雅”的解决方案,然后再选择这个作为我接受的答案。@jmboufard-你可能分析得太多了。您已经在使用onRetainingNonfigurationInstance()处理旋转。确保取消onDestory()中的异步任务。这应该是所需要的一切。如果用户按home键,并且phone没有终止您的活动(并调用onDestroy()),则重新加载活动将使其加载并准备好为用户启动。这对我不起作用,因为我希望在屏幕旋转时继续执行AsyncTask,并且每次旋转时都调用onDestroy()。我想将活动的异步任务传递给旋转后创建的新活动。