我正在尝试为我的Android应用优化复杂的数据更新程序和解析器。服务器提供三种接口功能。解析器需要来自所有这三个函数的数据。
完成数据下载后,解析器就可以启动了。它由许多不同的独立任务组成,可以并行化。
我在考虑使用Futures或FutureTasks来处理数据。
基本上,这是程序:
我的第一个问题:是否可以使用异步函数创建Futures,它使用回调来返回数据(网络框架)?
第二个问题:在这种情况下分别使用Futures或FutureTasks是否有任何缺点,或者有更好的解决方案来实现这一目标吗?
谢谢。
答案 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个任务)(有两个不同的标准执行程序:SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR)。
任务排队的方式也取决于您使用的执行者。如果是并行的,则限制为10(新的LinkedBlockingQueue(10))。如果是序列号,则不受限制(新的ArrayDeque())。
因此处理任务的方式取决于您运行它们的方式以及运行它们的SDK版本。至于线程限制,我们不保证任何,但是看看ICS源代码,我们可以说池中的线程数可以在5..128范围内变化。
当您使用默认执行方法启动太多任务(如100或更多)时,将使用串行执行程序。由于无法立即处理的任务被排队,您将获得OutOfMemoryError
(数组任务被添加到阵列支持的队列中)。
您可以立即启动的确切任务数取决于您运行的设备的内存类,以及您使用的执行程序的内存类。
因此,通过遵循此方法,一旦完成所有任务,您就可以使用处理程序来更新UI。
希望这有帮助。