【问题标题】:When is the onPreExecute called on an AsyncTask running parallely or concurrently?何时在并行或同时运行的 AsyncTask 上调用 onPreExecute?
【发布时间】:2012-09-03 09:20:44
【问题描述】:

我正在使用 Android HoneyComb。我需要并行执行一些任务,并且我正在使用 AsyncTask 的 public final AsyncTask executeOnExecutor (Executor exec, Params...params) 方法。在每个单独的线程中,我正在计算一些值,然后我需要将其存储在 ArrayList 中。然后我必须对所有值进行排序arrayList 然后在 UI 中显示它。现在我的问题是,如果一个线程比另一个更早完成,那么它会立即调用 onPostExecute 方法还是 onPostExecute 方法将在所有后台线程完成后调用?我的程序实现取决于这里发生的情况。

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    现在......它是这样......

    AsyncTask同步UI线程,Non-UI的Output在Non-UI线程上工作。

    onPreExecute()UI thread 上调用,在非 UI 工作开始之前

    然后doInBackground() 执行 旋转非 UI 线程,此时 onProgressUpdate(Progress...) 保持同时执行....但它的执行高度不可预测。

    doInBackground()之后,onPostExecute()在 UI 线程上运行。

    查看此链接了解更多详情:

    http://developer.android.com/reference/android/os/AsyncTask.html

    【讨论】:

    • 我明白了吗?但我的问题是 onPostExecute() 是否等待所有并行线程完成?
    • @Debarshi Dutta onPostExecute() 将仅等待 doInBackground() 中的 AsynTask,而不等待任何其他 AsyncTask 或任何其他线程......
    • 那么当我使用 executoronExecutor 方法时会发生什么?假设我使用两个 runnables?onpostExecute 会运行两次吗?
    • 那么这里使用AsyncTask的主要目的是给程序员Painless Threading的体验,如果你想使用Executors,那么再次记住它是Non-UI任务的Non-UI线程,那么你将需要一个处理程序来将其与专用 UI​​ 线程同步,这会扼杀使用 AsyncTask 的全部目的....
    【解决方案2】:

    即使使用 onexecuteExecutor 会给你并行执行,每个异步任务一旦完成就会调用 postexecute。

    但 asynctask 会自行返回,以便您在必要时知道哪个是哪个,并跟踪它们的返回顺序。

    The doc

    至于管理来自多个线程的数组列表,我认为您应该看看 Vectors,因为它们与快速失败行为同步。 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Vector.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2015-12-14
      • 2012-12-04
      • 1970-01-01
      相关资源
      最近更新 更多