2012-03-02 104 views
5

过去,方向更改和AsyncTask(以及其他长时间运行的后台任务)相互之间没有很好地发挥作用。总是有一个问题需要了解新创建的活动(从方向更改)中仍然运行着哪些任务(或线程),以及在未附加任何活动时任务结束时该怎么做。Android,AsyncTask,长时间运行的进程和方向更改

即使有碎片和LoaderManager,这对我仍然是一个问题。

现在,管理任意长时间运行的任务和方向更改的最佳方式是什么?了解新创建的活动中正在运行的任务。确保任务不会在未附加活动时尝试传递信息。

谢谢

+2

我建议你重写你的问题,在你并不真正表示“过程”的地方替换“过程”一词,而是指别的东西。操作系统进程有一个非常具体的定义,导致你的问题毫无意义(例如,进程不提供信息,活动不会创建进程)。 – CommonsWare 2012-03-02 20:52:59

回答

4

在我的节目,我只是把

android:configChanges="orientation|keyboardHidden|keyboard" 

在我的活动清单,并用它来完成。 1年后,我有0个问题。

+0

你如何去处理自己的配置更改? – synic 2012-03-05 18:31:48

+0

我发现在清单中有这样的活动会导致活动不会被重新创建,从而解决您的所有问题。我正在考虑自己处理它,但发现它在实践中是不必要的。它的工作方式,你会希望/想要它。 – Pyrodante 2012-03-05 18:40:49

+0

哇。我总是偏离这一点,因为它似乎比我想要的更复杂。你是对的,它似乎工作如何我想要它。 – synic 2012-03-05 18:48:45

-1

它和以前一样:使用服务。广播来自您的服务的事件,并将它们捕捉到您的活动(或某个中间层)中。然后您的活动可以根据其状态选择如何处理这些事件。

这是一个相当宽泛的问题。

+1

我不认为这是服务要解决的问题。看起来,如果您的应用程序没有任何独立于您的活动生命周期的任务,那么服务就会浪费资源。 – synic 2012-03-05 19:55:12

0

正如其他帖子所示,您可以使用android:configChanges = xxx。

但是,这并不总是需要。 Android旨在通过提供替代的屏幕布局来消除配置更改上的活动并创建新的活动,并且在某些情况下您可能会受益于此。 例如在多窗格应用程序中,这种情况很有意义,横向方向显示的视图与纵向方向不同。所以要回到你的问题:我没有阅读有关处理长时间运行操作的首选方法,但是从我自己的经验中,我建议将此任务存储在持久活动状态(在onRetainNonConfigurationInstance/onCreate中保存/恢复) ,或使用持久性片段。

如果您的活动检测到某个任务已经在运行,它可以让它有机会重新创建对话框以显示其进度。

注意:并不是唯一可以让您的活动重新创建的变化。为语言变化,对接和其他可能性做好准备:)但是,方向改变仍然是最常见的。

+0

当活动未附加时,持续碎片仍然有可能尝试传递结果。 onRetainNonConfigurationInstance不能存储(例如)活动的网络连接。这里的问题是没有为配置更改存储状态,它确保在没有附加活动时不传递数据,或者确保它没有尝试将其传递给死亡活动 – synic 2012-03-06 03:02:49