【问题标题】:Asynctask from non ui thread来自非 ui 线程的 Asynctask
【发布时间】:2013-01-23 18:55:07
【问题描述】:

我们是否必须从 UI 线程启动和执行 asyctask。如果我使用 asynctask 从非 ui 线程进行 Web 服务访问(长时间运行)是否正确。 抱歉,如果我的查询有误。

在我的应用程序中,我必须运行大约 10 个 web 服务,并且必须在 ui 上显示结果。我很困惑哪种方法是好的异步任务、意图服务或为每个 web 服务调用创建线程并使其并行运行。

【问题讨论】:

  • 只使用普通线程?
  • 我的答案怎么样试试……你可以重复使用相同的代码来调用不同类型的 Web 服务而不阻塞 UI 线程

标签: android


【解决方案1】:

要使 AsyncTask 正常工作,必须遵循一些线程规则:

  1. 必须在 UI 线程上加载 AsyncTask 类。这是从 JELLY_BEAN 开始自动完成的。

  2. 任务实例必须在 UI 线程上创建。

  3. execute(Params...) 必须在 UI 线程上调用。

  4. 不要手动调用 onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...)。

  5. 该任务只能执行一次(如果尝试第二次执行将抛出异常。)

    Further Details

在我个人看来,我建议使用 AsyncTask,因为它针对运行后台任务和利用多核处理器等优势进行了高度优化。

【讨论】:

  • 这是错误的,IntentService 不需要 AsyncTask,它已经在后台运行 IntentService is a base class for Services that handle ASYNCHRONUS requests (expressed as Intents) on demand. developer.android.com/reference/android/app/IntentService.html
  • @tyczj 你说的是真的,但拉胡尔的回答也是如此,尽管它可能不回答 OP。他没有提到使用 AsyncTask 的 IntentService。我怀疑 OP 虽然需要 IntentService。
  • @Simon 是的,我只是在谈论 intentservice 部分错误
【解决方案2】:

是的,asynctask 需要从 UI 线程运行。

我建议使用多个线程/runnables。您还需要在主活动类中实现一个处理程序来收听来自线程的响应。

【讨论】:

    【解决方案3】:

    您可以使用线程或异步任务。 AsyncTask 为您提供了在启动后台任务之前和完成后台任务或获取其进度之后管理 Ui 更改方法的方法。

    这取决于您的架构要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多