2

我在android中遇到以下问题:

我需要在 row 中处理一些异步任务(e.g. Async-Task 1 -> Async-Task 2 -> Asyc-Task 3)。所有的异步任务都用一个 handler 来回答(sendMessage(xy))

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

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

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

对不起,我的英语不好..

4

4 回答 4

2

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

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

您希望 Action A(并且一旦完成)调用 Action B(等等)......这意味着您实际上需要一个线程来执行 BL 操作的序列。

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

这会将整个过程封装起来,并且易于跟踪错误。我已经为具有多个服务器和 SMS 验证代码以及其他一些内容的登录流程进行了两次此建模。

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

于 2013-03-25T22:26:52.513 回答
1

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

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

AsyncTask 管理一个使用 ThreadPoolExecutor 创建的线程池。它将有 5 到 128 个线程。如果线程数超过 5 个,这些多余的线程最多会停留 10 秒,然后才会被移除。(注意:这些数字是针对目前可见的开源代码,因 Android 版本而异)。(commonware 对类似问题的回答)

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。

于 2013-03-25T21:59:10.703 回答
1

我建议使用 Otto & Tape(来自 Square)的组合。

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

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

于 2013-03-25T23:22:03.190 回答
0

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

我建议考虑使用Loaders而不是AsyncTasks. Loaders是异步运行的,在我看来更容易在代码中管理。使用加载器,当加载器完成运行一个onLoaderFinished方法时,您Activity可以实现加载器回调并且onCreateLoader可以处理多个加载器,因此这一切都比使用AsyncTask. 这是关于装载机的教程

于 2013-03-25T21:56:20.067 回答