如何在Android AsyncTask中使用ExecutorService?

12

我需要执行多个AsyncTask,然后收集它们的所有结果,整合并将最终结果返回给用户。

我正在寻找在Android中管理多个AsyncTask的方法。我考虑使用Java Concurrency包中的ExecutorService,但我遇到了问题,因为ExecutorService只接受Runnable或Callable。为了满足我的需求,我可以使用

ExecutorService.invokeAll((Collection<? extends Callable<T>> tasks)

当所有提交的任务都完成时,invokeAll()方法将仅返回List<Future><V>>列表,并且我可以从相应的Future中获取每个任务的结果。

除了AsyncTask无法被ExecutorService接受之外,ExecutorService一切正常。

是否有其他方法可以同时使用AsyncTaskExecutorService,如果可以,请推荐不同的方法。


1
好消息是AsyncTask有executeOnExecutor()方法,坏消息是它只能在API Level 11及以上版本中使用。 - yorkw
有关如何使用executeOnExecutor的任何参考资料?此外,此功能可在HoneyComb(API级别11)中使用,但我的应用程序的minSDK为4。 - Akh
1
如果你坚持的话,可以在 这里 查看我的回答。 - yorkw
1个回答

2
创建一个 AsyncTask 并从 doInBackground() 开始线程。当它们完成时,收集、合并等数据并将其返回。然后你可以在 onPostExecute 中使用它来更新 UI。启动太多的线程会消耗内存,因此你应该考虑它们是否真的需要并行运行。

AsyncTask本身内部有一个线程池。我们能否利用这个线程池来运行多个任务,而不是创建另一个线程池? - Akh
1
不是直接的。至于executeOnExecutor(),这个方法的目的是使同时执行多个AsyncTask成为可能,因为内部只能一次执行一个AsyncTask(Honeycomb及更高版本)。这意味着如果你几乎同时启动两个AsyncTask,第二个将在第一个完成之前等待开始。如果你需要做更复杂的事情,你不必使用AsyncTask,只需像往常一样使用线程代码并使用Handler在获得结果时通知UI即可。 - Nikolay Elenkov
“这并不是真的,意思是如果你同时启动了两个AsyncTask,第二个会等待第一个完成才开始。” - Zou
你可以使用AsyncTask.executeOnExecutor来实现多线程的目的。 - Zou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接