【问题标题】:Where does the asynchronous operation run in an AsyncTask?异步操作在 AsyncTask 中运行在哪里?
【发布时间】:2019-05-15 23:22:43
【问题描述】:

AsyncTask 的异步操作是否在DoInBackgroundOnPostExecute 中运行?

public class Task1 : AsyncTask
{
    protected override void OnPreExecute()
    {
    }

    protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
    {
        return true;
    }

    protected override void OnPostExecute(Java.Lang.Object result)
    {
    }
}

更新

我想我想问的是,在DoInBackground 中运行的例程/过程/任务是否一定是一个线程,或者它是否更像是一个任务的抽象概念,如果是,它是否计划这样运行(即它也可以配置为在主线程上运行)。同样,在OnPostExecute 中运行的“延续”是否也被视为任务,因为它在主线程上运行,但也可以“调度”在同一线程上与其他“任务”一起运行(如点击处理程序或在 onResume 之类的生命周期覆盖上)?

【问题讨论】:

  • 在 doInBackground 中执行,preExecute 和 postExecute 在 UI 线程中执行 developer.android.com/reference/android/os/AsyncTask
  • @JoaquinAlvarez 但是doInBackground 在一个单独的线程中运行,在 UI 之外,所以是“异步”,或者是当 postExecute 计划在 UI 上运行时,以及说点击事件处理程序?
  • 我认为异步部分是 doInbackGround 因为它是一个单独的线程,而 postexecute 和 preexecute 使用 UI 线程
  • @JoaquinAlvarez 但是doInbackGround 不是“并行”运行的吗?

标签: android asynchronous android-asynctask


【解决方案1】:

DoInBackground()onPostExecute 中异步完成你得到结果和它的UI线程

【讨论】:

  • DoInBackground 在它自己的线程中运行,onPostExecute 回到 UI/主线程,对吗?
  • 是的。这就是为什么 DoInBackground 称为后台线程。而且它不会中断主线程上的任何东西
  • 所以DoInBackground 在技术上运行“不同步”,但更像是“并行”运行到 UI 线程。然而,onPostExecute 被安排在 UI 线程上,以及当前正在运行的任何东西,无论是之前还是之后,这更像是“无序”,对吗?
  • 是的。没错。
  • onPostExecute 等待在DoInBackground 中处理的结果。
【解决方案2】:

这是执行异步任务时任务所经历的 4 个步骤:

  1. onPreExecute(),在任务执行前在 UI 线程上调用。
  2. doInBackground(Params...),在 onPreExecute() 执行完成后立即在后台线程上调用。
  3. onProgressUpdate(Progress...),在调用 publishProgress(Progress...) 后在 UI 线程上调用。
  4. onPostExecute(Result),在后台计算完成后在 UI 线程上调用。

根据文档doInBackground(Params...)

doInBackground(Params...),在后台线程上调用 在 onPreExecute() 完成执行后立即。这一步使用 执行可能需要很长时间的后台计算。这 异步任务的参数传递给这一步。这 此步骤必须返回计算结果,并将 回到最后一步。这一步也可以使用 publishProgress(Progress...) 发布一个或多个进度单位。 这些值在 UI 线程上发布,在 onProgressUpdate(Progress...) 步骤。

Async Task | Android Developers

为了回答您的问题,任何后台计算都在 doInBackground 方法中进行。

【讨论】:

  • 那么你会说doInBackground,它在它自己的线程中与UI线程并发运行,是异步操作,还是你会说它在onPostExecute中运行的“延续”是?
  • 是的,完全正确。任何后台计算都应该在doInBackground方法中执行
  • 但是onPostExecute 是如何在同一个线程上运行的呢?比如说之前的点击事件呢?这两个“任务”是否都被某个任务调度程序安排在同一个线程上运行?
  • onPreExecuteonPostExecute 在 UI 线程上调用。还要记住,该任务只能执行一次(如果尝试第二次执行,则会引发异常。)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2012-03-12
  • 2013-06-20
  • 2019-03-18
  • 1970-01-01
相关资源
最近更新 更多