【问题标题】:How to use ExecutorService with Android AsyncTask?如何将 ExecutorService 与 Android AsyncTask 一起使用?
【发布时间】:2012-03-18 13:47:48
【问题描述】:

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

我正在寻找一种在 Android 中管理多个 AsyncTasks 的方法。我正在考虑使用 Java Concurrency 包中的ExecutorService,但我卡住了,因为ExecutorService 只接受 Runnables 或 Callables。为了确定我的要求,我可以使用

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

invokeAll() 方法只会在所有提交的任务都完成后返回List<Future><V>> 的列表,并且我可以从对应的Future 获取每个任务的结果。

ExecutorService 一切正常,因为它不接受 AsyncTask

还有其他方法可以使用AsyncTaskExecutorService,或者如果您可以推荐不同的方法。

【问题讨论】:

  • 好的是AsyncTask 有方法executeOnExecutor(),不好的是它只在API Level 11 之后才可用
  • 关于如何使用 executeOnExecutor 的任何参考资料?此外,HoneyComb(API 级别 11)提供此功能,但我的应用程序的 minSDK 为 4。
  • 如果您坚持,请查看我的回答here

标签: android multithreading asynchronous android-asynctask executorservice


【解决方案1】:

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

【讨论】:

  • AsyncTask 本身内部有一个线程池。我们可以使用这个池来运行多个任务而不是我创建另一个吗?
  • 不是直接的。至于executeOnExecutor(),这个方法的目的是为了可以同时执行多个AsyncTask,因为内部的一次只能执行一个AsyncTask(Honeycomb 及以后)。这意味着如果您或多或少同时启动两个AsyncTasks,第二个将等待第一个完成后再开始。如果您需要做一些更复杂的事情,您不必使用AsyncTask,只需像往常一样使用您的线程代码,并在获得结果时使用 Handler 通知 UI。
  • “这意味着如果你或多或少同时启动两个 AsyncTasks,第二个将等待第一个完成后再开始”是不正确的
  • 您可以将 AsyncTask.executeOnExecutor 用于多线程目的。
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 2017-11-17
  • 2013-08-05
  • 2016-04-19
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多