具有回调活动或片段的长时间运行任务

时间:2017-01-10 20:31:31

标签: android android-activity android-asynctask android-service

问题:从长时间运行的任务向活动报告进度/完成的最佳做法是什么?当活动在后台/方向发生变化时,进度/完成报告发生时该怎么办?

现实生活中的例子: 活动进行网络调用从服务器获取数据(这可能需要10秒以上)。 此网络呼叫完成后,应通知活动,并且活动应显示网络呼叫已完成。

只要应用程序保持打开状态,这很容易实现。我的问题是,如果在应用程序处于后台时网络调用已完成,该怎么办(活动将错过任何回调)。

我一直在研究以下方法,但我无法决定该怎么做:

  • 生成执行网络调用的线程的服务。服务绑定到活动。在网络呼叫完成时,服务回调到活动。如果当服务进行回调时Activity处于后台(因此Activity错过了回调),那么Activity应该在服务中轮询已保存的数据吗?
  • 在网络通话结束时广播数据的IntentService(如果Activity因为在后台播放而错过了这个广播怎么办?)
  • AsyncTask,但是当Activity在后台等时这很糟糕。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我使用HeadlessFragments作为其调用来解决此问题。 This博客文章详细解释了如何实现它,以及您提到的问题由它处理。

编辑: 对于评论中的问题:

  1. 对于您的具体问题,当Activity在后​​台时,回调会丢失,答案是否定的。处于"背景"意味着Activity仍然存在。在我发布的链接中,当callbackActivity分离时ActivityActivitydestroyedActivity。因此,如果您的destroyed位于后台,而不是callback,那么它仍会获得callback并执行您在paused中执行的任何操作。虽然Android可以杀死Activity的活动,但在这种情况下,您的destroyed将为callback,而您却无法获得SQLite。在这种情况下,您可以将从服务器获得的数据保存在持久存储中,例如Activity,并防止在创建Activity时进行另一次网络呼叫或进行网络呼叫,这将确保只要createdFragment,您就可以显示数据(当然,通话时会通过)。

  2. 使用AsyncTask专门用于处理您在问题中提到的配置更改。正在运行的任务仍由Fragment完成,而不是由Fragment完成。 jQuery仅包含对象的引用。因此,我认为它不是最佳实践"。