0

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

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

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

所以基本上,这是程序:

  1. 创建Task-1、Task-2、Task-3用于下载数据
  2. 等待下载完成
  3. 创建 Task-1,..., Task-N 用于解析数据
  4. 等待解析器完成
  5. 调用回调以表明该过程已完成。

我的第一个问题:是否可以使用异步函数创建 Futures,使用回调返回数据(网络框架)?

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

谢谢你。

4

1 回答 1

0

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

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

这可以通过使用异步任务轻松实现。我将告诉你方法而不是代码示例。

Things to note about Async Task

在 1.6 之前,Async Task 使用单个附加线程处理所有后台操作。在 1.6 到 3.0 之后……它发生了变化,因此开始使用线程池。并且可以同时处理操作。

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

How to implement your requirement

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

任务入队的方式还取决于您使用的执行器。在并行的情况下,您的限制为 10(新的 LinkedBlockingQueue(10))。如果是连续的,则不受限制(新的 ArrayDeque())。

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

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

您可以一次启动的确切任务数量取决于您正在运行的设备的内存类别,以及您使用的执行程序。

因此,按照这种方法,一旦完成所有任务,您就可以使用处理程序来更新 UI。

希望这可以帮助。

于 2015-01-07T02:08:35.843 回答