处理程序中的异步任务?在行中执行多个异步任务

时间:2013-03-25 21:43:16

标签: android android-asynctask android-handler

我在android中遇到以下问题:

我需要处理行(e.g. Async-Task 1 -> Async-Task 2 -> Asyc-Task 3)中的一些异步任务。所有异步任务都使用处理程序(sendMessage(xy))进行回答。

所以我的处理程序必须启动下一个异步任务。这是最佳做法吗?我应该选择其他方式吗?

总结:我正在寻找一种方法,以串行方式处理许多异步任务......

我不能使用asyncThread的get()函数,因为它们仅在处理程序中返回它们的答案。

抱歉我的英文不好..

4 个答案:

答案 0 :(得分:2)

有趣的是,其他两个答案都错过了你想连续做的事实......:)

我个人讨厌AsyncTask,我宁愿在我自己的线程中实现它,但那就是我。

你想要Action A(并且一旦完成)调用Action B(依此类推)......这意味着你实际上需要一个线程来执行BL动作序列。

这可以通过一个带有两个处理程序的对象轻松实现,一个是BL的新ThreadHandler的处理程序,另一个可能是用于UI更新的 UI线程处理程序,任务完成后,它会在BL处理程序上发布以启动下一个任务。

这会将整个过程封装起来,并且很容易跟踪错误。我已经为使用多个服务器的登录流程完成了两次这种建模。短信验证码,以及其他一些东西。

它还将涵盖一个任务的成功或失败结果需要调用不同任务的场景。

答案 1 :(得分:1)

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。

如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。(直接来自doc)

AsyncTask管理使用ThreadPoolExecutor创建的线程池。它将有5到128个线程。如果有超过5个线程,那么这些额外的线程将被移除最多10秒钟。 (注意:这些数字是针对目前可见的开源代码,因Android版本而异)。(通过类似问题的常见软件回答)

http://developer.android.com/reference/android/os/AsyncTask.html

http://developer.android.com/reference/java/util/concurrent/Executor.html。考虑使用执行器。

您也可以考虑使用RoboSpice。 https://github.com/octo-online/robospice 您也可以进行多次spicerequest。

答案 2 :(得分:1)

我建议使用Otto和amp;的组合。磁带(来自Square)。

您可以查看使用队列将图像上传到服务器的示例。

https://github.com/square/tape/tree/master/tape-sample/src/main/java/com/squareup/tape/sample

答案 3 :(得分:0)

如果您需要同时执行所有这些任务,那么除了启动多个异步任务之外,您别无选择。但是,如果您只需要在后台执行所有这些任务,那么您可能只需启动一个异步任务并为其提供参数以执行其他任务。

我建议使用Loaders代替AsyncTasksLoaders是异步运行的,在我看来,在代码中管理起来更容易。使用加载器在加载器完成运行时调用onLoaderFinished方法,您的Activity可以实现加载器回调,onCreateLoader可以处理多个加载器,所以这一切都比使用它简单得多AsyncTask。这是tutorial on loaders