如何在安卓系统中有效地管理多个异步任务

我有一个场景,我必须对我的服务器进行六次http调用以获取六个不同项目的数据。这些服务器调用不能组合,它们就是这样。例如:如果您需要GOOGLE的报价信息,请向服务器发送请求,请求Google的报价信息。接下来,如果您需要雅虎,那么您可以启动另一个http调用,依此类推。

情况如下:

  1. 现在,我的最终用户想要比较6家不同的公司。
  2. 正如我所提到的,我使用6个异步任务进行6个http调用是不可避免的。
  3. 当我获得每个异步任务响应时,我将使用新数据刷新 UI。
  4. 如果我在很短的时间内刷新UI 6次,这是一个糟糕的UI体验。
  5. 它给我的UI带来了闪烁效果,这是不需要的。

我的问题:

  1. 如何阻止刷新 UI,直到我收到所有 6 个异步任务响应?
  2. 我知道每个任务都是相互独立的。我是否应该运行一段时间循环并等到我收到所有响应?
  3. 有没有更好的方法来做到这一点,而不是一段时间循环,因为如果任何一个调用没有响应,那么我将永远等待。

注意:我猜Android 1.6 +确实并行执行异步任务。

这更像是一个设计问题,我将不胜感激。

提前致谢


答案 1

您可以创建一个 AsyncTask 池对象,该对象允许您欺骗“批处理”http 调用。

  1. 创建一个可观察的异步任务集合,我将把这个集合称为你的池
  2. 您的活动创建异步任务(但尚未执行)并将其添加到池中
  3. 活动将自己注册为池的观察者
  4. 活动告诉池执行,池依次调用执行其每个任务
  5. 当任务完成时(对于成功和失败),它们将响应数据存储在池中,池将任务标记为“完成”
  6. 将所有任务标记为完成后,池会通知正在收听的活动

一般的想法是让池知道有多少任务和挂起,并存储已完成调用的聚合数据。完成所有操作后,通知观察活动并传回所有数据。

您必须弄清楚异步任务如何告诉池它们已完成。也许只是有一个 AsyncTask 的实现,该实现在其构造函数上采用 Pool,以便任务具有对池的引用。


答案 2

您可以通过多种方式处理此问题

  • 另一个聚合来自网络任务的响应。AsyncTask
  • 执行每(例如)500 毫秒,由您创建的 a,该更新从网络任务传入的数据并继续这样做,直到处理完所有网络结果。sendEmptyMessageDelayed()HandlerActivity
  • 执行聚合的线程。

如果是我,我可能会选择.总而言之,让网络任务将数据存储在某个中间存储中。将延迟的消息发送到处理程序,并在检查中间存储中的数据并发布更新的结果。如果有未完成的结果,请再次发布延迟的消息。HandlerhandleMessage()


推荐