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



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

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

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

所以基本上,这是程序:

    创建任务 1、任务
  1. 2、任务 3 以下载数据
  2. 等待下载完成
  3. 创建任务 1,...,用于解析数据的任务 N
  4. 等待解析器完成
  5. 调用回调以指示进程已完成。

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

第二个问题:在这种情况下分别使用期货或未来任务有什么缺点吗,或者是否有更好的解决方案来实现这一点?

谢谢。

基本上你正在尝试实现以下目标。

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

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

Things to note about Async Task

在 1.6 之前,异步任务使用单个附加线程处理所有后台操作。在 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。

希望这有帮助。

最新更新