【问题标题】:Android, AsyncTask, long running processes, and orientation changesAndroid、AsyncTask、长时间运行的进程和方向更改
【发布时间】:2012-03-21 08:26:48
【问题描述】:

在过去,方向变化和 AsyncTask(以及其他长时间运行的后台任务)不能很好地相互配合。一直存在一个问题,即知道哪些任务(或线程)仍在新创建的 Activity 中运行(来自方向更改),以及在未附加 Activity 时任务结束时该怎么做。

即使使用 Fragments 和 LoaderManager,这对我来说似乎仍然是个问题。

如今,管理任意长时间运行的任务和方向变化的首选方式是什么?了解新创建的活动中正在运行哪些任务。确保在未附加 Activity 时任务不会尝试传递其信息。

谢谢

【问题讨论】:

  • 我建议你重写你的问题,在你不是真的指“过程”而是指其他意思的地方替换“过程”这个词。操作系统进程有一个非常具体的定义,它会使您的问题毫无意义(例如,进程不传递信息,活动不创建进程)。

标签: android


【解决方案1】:

在我的程序中我只是放了

 android:configChanges="orientation|keyboardHidden|keyboard"

在我的活动清单中并完成它。 1 年后,我遇到了 0 个问题。

【讨论】:

  • 您如何自己处理配置更改?
  • 我发现在清单中包含它会导致无法重新创建活动,从而解决您的所有问题。我打算自己处理它,但在实践中发现它没有必要。它可以按照您的期望/想要的方式工作。
  • 哇。我总是偏离这一点,因为它似乎比我想要的更复杂。你是对的,它似乎按我的意愿工作。
  • 我有一些非常复杂的事情,如果出了什么问题,那就太糟糕了,到目前为止一切都很好:D
  • 非常感谢先生,这比我想象的要容易得多。
【解决方案2】:

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

但是,这并不总是需要的。 Android 旨在终止配置更改的活动,并创建新的活动,在某些情况下,您可能会从中受益,通过提供替代屏幕布局。 例如,这在多窗格应用中是有意义的,其中横向显示的视图与纵向显示的视图不同。

所以回到您的问题:我没有阅读有关处理长时间运行操作的首选方法,但根据自己的经验,我建议将此类任务存储在持久活动状态(在 onRetainNonConfigurationInstance/onCreate 中保存/恢复),或使用持久性片段。

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

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

【讨论】:

  • Persistent Fragments 仍然有可能在 Activity 未附加时尝试传递结果。 onRetainNonConfigurationInstance 不能存储活动的网络连接。这里的问题不是存储配置更改的状态,而是确保在未附加 Activity 时不传递数据,或者确保它不会尝试将其传递给死 Activity
【解决方案3】:

一如既往:使用服务。从您的服务中广播事件并在您的活动(或某个中间层)中捕获它们。然后,您的 Activity 可以根据其状态选择如何处理这些事件。

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

【讨论】:

  • 我认为这不是服务旨在解决的问题。看起来如果你的应用没有任务独立于你的 Activity 生命周期,那么 Service 只会浪费资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多