0

问题:从长时间运行的任务到活动报告进度/完成的最佳做法是什么?当活动处于后台/方向更改时发生进度/完成报告时该怎么办?长时间运行任务,回调活动或片段

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

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

我一直在看下面的方法可以做到这一点,但我不能决定该怎么做:

  • 服务的滋生其中执行网络调用线程。服务绑定到活动。在网络通话完成时,向该活动提供服务回调。如果Activity在后台进行回调时处于后台(因此Activity未命中回调),Activity是否应该对Service进行轮询以获取保存的数据? (做什么,如果活动错过这个广播,因为它是在后台?)
  • IntentService是广播网络时,通话结束后的数据
  • 的AsyncTask,但坏就坏在活动是在后台等

我应该如何解决这个问题?

回答

0

我已经使用HeadlessFragments来解决这个问题。 This博客文章详细解释了如何实现它,并且您提到的问题由它处理。

编辑: 对于注释的问题:

  1. 为了您的具体问题,有关回调丢失时Activity是在后台,答案是否定的。处于“背景”意味着Activity仍然活着。从我发布的链接中,callback(即Activity本身)在与Activity脱离时即Activitydestroyed时被删除。所以,如果你的Activity在后台,而不是destroyed,它仍然会得到callback,并在callback中做任何你所做的事情。虽然Android可以杀死paused的活动,但在这种情况下,您的Activity将是destroyed,并且您将不会获得callback。在这种情况下,您可以将从服务器获取的数据保存在永久性存储器中,如SQLite,并且可以在创建Activity时阻止进行其他网络呼叫或进行网络呼叫,这将确保无论何时Activitycreated,将有数据显示(当然,电话会通过)。

  2. Fragment的使用专门用于处理您在问题中提到的配置更改。正在运行的任务仍由AsyncTask而不是Fragment完成。 Fragment仅保存对该对象的引用。所以,我认为它不是“最佳实践”。

+0

感谢您的链接。我有两个问题: 如果任务在活动在后台完成,该怎么办?那么所有的回调都会被错过,对吧?当活动在后台时,如何获取从服务器检索到的数据? 它似乎不是一个“最佳实践”使用片段运行任务? 虽然我确实看到了这个方法的重点。 编辑:我应该将数据存储在HeadlessFragment中,然后如果“TaskHasFinished”请求片段中的数据? –

+0

@JonasJensen请参阅编辑回答你的问题。 – Nerd