我正在尝试为我的Android应用程序优化复杂的数据更新器和解析器。服务器提供三种接口功能。解析器需要来自所有这三个函数的数据。
数据下载完成后,解析器可以启动。它由许多不同的独立任务组成,这些任务可以并行化。
我正在考虑使用Futures或FutureTasks来处理数据。
所以基本上,这是程序:
- 创建任务 1、任务
- 2、任务 3 以下载数据
- 等待下载完成
- 创建任务 1,...,用于解析数据的任务 N
- 等待解析器完成
- 调用回调以指示进程已完成。
我的第一个问题:是否可以使用异步函数创建 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。
希望这有帮助。