【问题标题】:How do I run Async tasks synchronously without post execute chaining?如何在没有执行后链接的情况下同步运行异步任务?
【发布时间】:2015-05-06 18:24:29
【问题描述】:

我有三个异步任务,我希望能够同步运行它们。如果不将它们放在彼此的onPostExecute 中,我怎么能做到这一点?很抱歉,如果这已被涵盖,但我似乎无法在谷歌或这里找到正确的关键词。

new parseZip().execute();
new loadContent().execute();
new playContent().execute();

任何帮助将不胜感激,或者只是一个线程的链接

谢谢

【问题讨论】:

  • 你的标题和帖子有点不清楚。您的意思是希望它们串行执行还是并行执行?
  • 连续,如果不清楚,对不起
  • 这是默认行为,就像 Honeycomb 一样。在此处检查 执行顺序 部分:developer.android.com/reference/android/os/AsyncTask.html
  • 哇,它是.. 导致问题的其他原因.. 谢谢迈克。假设又让我出丑了。

标签: java android multithreading concurrency android-asynctask


【解决方案1】:

我希望能够同步运行它们。我怎样才能做到这一点 不把它们放在彼此的 onPostExecute 中?

为三个独立的任务创建自己的线程并同步它们以串行执行。见here。这张幻灯片的作者还写了一本关于 Android 中的多线程的书。

另请参阅Specifying the Code to Run on a Thread 示例。

顺便说一句,AsyncTasks 默认是串行运行的。如果我是你,我会简单地将它们放在彼此的onPostExecute() 中。这有什么问题?

【讨论】:

  • 老实说,我一直在做这些链式调用,并认为它们有点奇怪,不是最佳做法,所以我想我只是来问问..只是看看有没有办法让它更清楚,我想如果每个人都这样做,那很好..
  • ZygoteInit,这是我刚刚在 cmets 部分发现的默认行为。很抱歉浪费了你的时间,但至少你也学到了一些东西:D
  • 无需道歉 :) 编程的概念通过讨论、阅读和实践变得清晰......最好
  • @Ben:你并不孤单。大多数现代语言已经实现了通道 (go-lang) 或 async/await (C#, es2015-alpha),以解决回调地狱的确切问题。链接异步调用是错误的,你的直觉是正确的。
  • @VansS 是的,自从这个问题以来,我已经尝试过 go lang,它非常酷,我很高兴看到它。 Objective c 的块也很酷。
【解决方案2】:

您可以使用getStatus() 查询AsyncTask 的状态,以检查给定任务是否已结束然后启动另一个任务,但这意味着不断检查 wach 任务的状态,这不是好主意。

您也可以,如您所说,在彼此的onPostExecute 上启动以下任务,但是看到您的任务名称我认为您也在单独使用这些任务,因此这意味着某种标志来控制任务是否应该被链接。

也许更好的方法是创建一个新的AsyncTask 来执行每个巡视任务完成的所有工作(可能需要一些重构来完成方法中的工作以避免重复您的代码)。

来自文档:

AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类 并且不构成通用线程框架。

因此,在您的情况下,AsyncTask 可能不是完成这项工作的正确工具,您应该考虑使用 @ZygoteInit 建议的普通线程。

【讨论】:

  • 嗨 Antonio,有人告诉我,如果它在我的 playContent 中进行大量处理,并且我需要经常调用 'runOnUIThread',最好使用 Async Task。跨度>
  • 您是否建议使用 getStatus 东西我不断循环以测试它是否已更改?
  • 你是对的。我进行了编辑,因为我不建议不断循环以测试状态是否已更改(这不是一个好主意)。如果您想保留AsyncTask 并从其优势中受益而不使用 onPostExecute 将它们链接起来,最好的方法是将现有任务的 doInBackground 集成到一个新任务中。
  • Antonio,这是我刚刚在 cmets 部分发现的默认行为。很抱歉浪费了你的时间,但至少你也学到了一些东西:D
  • 讨论是学习的方式,所以永远不要浪费时间:)
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2019-12-06
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多