2011-04-26 69 views
7

我有一个运行一个简单的AsyncTask的活动。为了保持AsyncTask在屏幕旋转期间运行,我使用onRetaingNonConfigurationInstance()将AsyncTask传递给新的Activity,如线程How to handle an AsyncTask during Screen Rotation?中的一个答案中推荐的那样。然后,我更新AsyncTask中Activity的指针,以确保它仍然可以从onProgressUpdate()更新进度对话框。在旋转期间保持AsyncTask,但不在活动删除

我的问题是,使用这种方法,我无法检测活动是否只是旋转(在这种情况下,我想继续运行AsyncTask),或者如果活动被主页按钮隐藏,在这种情况下,我想停止AsyncTask。但是,我可以检测后退按钮的用法,因为在这种情况下,Activity的isFinishing()返回true;

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

回答

2

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

更新

我又想起了我的解决方案,并经过一番搜索,我认为这是错误的,因为的onDestroy()如果​​你按下home键将不会被调用。并且onStop()在onRetaingNonConfigurationInstance()之前被调用,所以停止AsyncTask将会提前,因为您不知道它是否是配置更改。

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

+1

感谢您的建议,但我会稍微等一下,看看有人提供更“优雅”的解决方案之前,选择这个作为我接受的答案。 – jmbouffard 2011-04-27 14:17:18

+0

@jmbouffard - 你可能会分析这一点。你已经在使用onRetainingNonConfiguraitonInstance()来处理旋转。确保取消onDestory()中的AsyncTask。这应该是所有需要的。如果用户按下home并且手机不会终止您的活动(并调用onDestroy()),则重新加载活动将使其加载并准备好供用户使用。 – eyespyus 2011-06-02 04:47:12

+1

它不适用于我,因为我希望我的AsyncTask在屏幕旋转发生时继续并在每次旋转时调用onDestroy()。我想将我的活动AsyncTask传递给循环后创建的新Activity。 – jmbouffard 2011-06-03 13:28:10

0

Here我发现了一个非常优雅的解决方案,如何使用AsyncTasks和ProgressDialogs。现在我不能说它是否适合你的情况。尝试一下。

0

你必须在这个清单添加到活动声明:

机器人:configChanges =“keyboardHidden |方向|屏幕尺寸”

旋转时应该保留所有的活动保持不变。

希望它有帮助