Android:Future / FutureTask用于并行处理数据

时间:2015-01-06 21:40:03

标签: android multithreading parallel-processing future futuretask

我正在尝试为我的Android应用优化复杂的数据更新程序和解析器。服务器提供三种接口功能。解析器需要来自所有这三个函数的数据。

完成数据下载后,解析器就可以启动了。它由许多不同的独立任务组成,可以并行化。

我在考虑使用Futures或FutureTasks来处理数据。

基本上,这是程序:

  1. 创建Task-1,Task-2,Task-3以下载数据
  2. 等待下载完成
  3. 创建Task-1,...,Task-N以解析数据
  4. 等待解析器完成
  5. 调用回调来表示该过程已完成。
  6. 我的第一个问题:是否可以使用异步函数创建Futures,它使用回调来返回数据(网络框架)?

    第二个问题:在这种情况下分别使用Futures或FutureTasks是否有任何缺点,或者有更好的解决方案来实现这一目标吗?

    谢谢。

1 个答案:

答案 0 :(得分:0)

基本上你正在努力实现以下目标。

步骤1 - 来自UI的用户启动1,2,... n下载任务。 步骤2 - 完成每个任务后,应启动新线程来处理它。 第3步 - 完成所有n个任务后,应更新UI ...可能是成功对话框。

使用Async Task可以轻松实现。我将告诉你方法,而不是代码示例。

Things to note about Async Task

在1.6之前,Async Task使用一个额外的线程处理所有后台操作。 在1.6到3.0之后......它被改变了,所以开始使用一个线程池。并且可以同时处理操作。

由于Honeycomb默认行为被切换回使用单个工作线程(逐个处理)。

How to implement your requirement

根据您的要求,如果您愿意,可以使用方法(executeOnExecutor)同时执行任务(1到n个任务)(有两个不同的标准执行程序:S​​ERIAL_EXECUTOR和THREAD_POOL_EXECUTOR)。

任务排队的方式也取决于您使用的执行者。如果是并行的,则限制为10(新的LinkedBlockingQueue(10))。如果是序列号,则不受限制(新的ArrayDeque())。

因此处理任务的方式取决于您运行它们的方式以及运行它们的SDK版本。至于线程限制,我们不保证任何,但是看看ICS源代码,我们可以说池中的线程数可以在5..128范围内变化。

当您使用默认执行方法启动太多任务(如100或更多)时,将使用串行执行程序。由于无法立即处理的任务被排队,您将获得OutOfMemoryError(数组任务被添加到阵列支持的队列中)。

您可以立即启动的确切任务数取决于您运行的设备的内存类,以及您使用的执行程序的内存类。

因此,通过遵循此方法,一旦完成所有任务,您就可以使用处理程序来更新UI。

希望这有帮助。