【问题标题】:Async-Task in Handler? Doing multiple Async-Tasks in Row处理程序中的异步任务?在行中执行多个异步任务
【发布时间】:2013-03-25 21:43:16
【问题描述】:

我在 android 中遇到以下问题:

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

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

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

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

对不起我的英语不好..

【问题讨论】:

    标签: android android-asynctask android-handler


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 您介意在您正在谈论的这个实现上发布一些代码吗?并且 +1 表示实际上注意到这个人在他的标题中问了什么。
    • 我不知道 robospice,从不需要任何东西来管理异步任务,因为我学得很快,如果处理不当,它们会导致内存泄漏,而且大多数时候人们不会,所以我对于所有这些,总是有一个纯 Java 解决方案。
    • 关于一个例子,这需要一个实质性的实现才能真正工作,我不想发布不能正常工作的 pesado 代码,这是我们正在谈论的多线程。不幸的是我很忙...... :(
    • 创建一个新的线程 Handler(),并调用它的 getHandler() 方法(获取新线程的处理程序实例,以便您可以使用它)。 BL 代表 BusinessLogic,无论您想在后台执行什么而不是可见的,例如从服务器获取一些东西,计算一些巨大的东西,等待短信到达。
    【解决方案2】:

    首次引入时,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。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        我建议考虑使用Loaders 而不是AsyncTasksLoaders 是异步运行的,我认为在代码中更容易管理。对于加载程序,当加载程序完成运行 onLoaderFinished 方法时,您的 Activity 可以实现加载程序回调,onCreateLoader 可以处理多个加载程序,因此这一切都比使用 AsyncTask 简单得多。这是tutorial on loaders

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多