如何在Android中有效管理多个异步任务

时间:2012-02-10 01:01:47

标签: java android http asynchronous android-asynctask

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

情况如下:

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

    1. 在获得所有6个异步任务响应之前,如何暂停刷新UI?
    2. 我理解每项任务都是相互独立的。我应该运行while循环并等到收到所有响应吗?
    3. 有没有更好的方法来做这个而不是while循环,因为如果任何一个调用没有响应,那么我将永远等待。
    4. 注意:我想Android 1.6+会并行执行异步任务。

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

      提前致谢

4 个答案:

答案 0 :(得分:4)

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

  1. 创建一个Observable AsyncTasks集合,我将此集合称为您的池
  2. 您的Activity创建了AsyncTasks(但尚未执行)并将它们添加到池
  3. Activity将自己注册为Pool的观察者
  4. Activity告诉Pool执行,Pool依次调用每个任务上的执行
  5. 当任务完成时(成功和失败),他们将响应数据存储在池中,并且池将任务标记为“完成”
  6. 将所有任务标记为已完成后,池会通知收听活动
  7. 一般的想法是让Pool知道有多少任务和待处理,以及存储已完成调用的聚合数据。完成所有操作后,通知观察活动并传回所有数据。

    你必须弄清楚AsyncTasks如何告诉Pool他们已经完成了。也许只是简单地使用AsyncTask的实现,在其构造函数上使用Pool,以便Tasks可以引用Pool。

答案 1 :(得分:1)

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

  • 聚合来自网络任务的响应的另一个AsyncTask
  • 每隔500毫秒执行一次sendEmptyMessageDelayed() Handler创建Activity创建的Handler,刷新从网络任务进入的数据,并继续这样做直到所有处理网络结果。
  • 执行聚合的线程。

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

答案 2 :(得分:1)

我发现这个解决方案更适合我的问题。 此链接描述了几种建立此方法的方法。 1. ExecutorService 2. ExecutoreService和CountDownLatch

ExecutoreService and CountDownLatch

答案 3 :(得分:1)

只是在黑暗中刺伤,但你有:

  • 1x主UI线程
  • 6x背景asynchtasks,有:6x方法在后台执行 将数据返回到UI(前景)的6x方法

为什么在UI线程中没有公共范围的变量,称为“ finishedTasks ”,然后在每个6x返回数据线程中使用相同的方法:

  • 增加finishedTasks

  • 如果finishedTasks == 6则运行1个公共方法来更新UI

然后它将在所有背景上更新UI asychtasks完成。