我在android中遇到以下问题:
我需要处理行(e.g. Async-Task 1 -> Async-Task 2 -> Asyc-Task 3)
中的一些异步任务。所有异步任务都使用处理程序(sendMessage(xy))
进行回答。
所以我的处理程序必须启动下一个异步任务。这是最佳做法吗?我应该选择其他方式吗?
总结:我正在寻找一种方法,以串行方式处理许多异步任务......
我不能使用asyncThread的get()函数,因为它们仅在处理程序中返回它们的答案。
抱歉我的英文不好..
答案 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
代替AsyncTasks
。 Loaders
是异步运行的,在我看来,在代码中管理起来更容易。使用加载器在加载器完成运行时调用onLoaderFinished
方法,您的Activity
可以实现加载器回调,onCreateLoader
可以处理多个加载器,所以这一切都比使用它简单得多AsyncTask
。这是tutorial on loaders。