【问题标题】:AsyncTask's doInBackground starts its execution too late after AsyncTask::execute is called在调用 AsyncTask::execute 之后,AsyncTask 的 doInBackground 开始执行太晚了
【发布时间】:2012-09-13 10:55:36
【问题描述】:

我写了一个 AsyncTask 并且大部分时间在它的构造函数被调用和它的 doInBackground 被调用之间没有延迟(0 ms 延迟)。 但是,每当在后台进行联系人同步时,我的 AsyncTasks 的构造函数和 doInBackground 之间经常会出现 1-3 秒的延迟。在我的情况下,这种延迟是不可接受的。 我知道 AsyncTask 是一个后台线程,这个问题可以通过使用 Thread 并将其优先级设置得更高来解决。但我想知道的是,我怎么知道是什么导致我的 AsyncTask 的 doInBackground 被调用? 我使用了 adb shell top -m 10,出现这个问题时进程使用似乎很正常。

感谢任何帮助。

谢谢

【问题讨论】:

  • IMO,通常它会立即执行,如果还有另一个线程也在运行,则会使其滞后,所以最好检查你的线程并很好地同步它们。

标签: android android-asynctask


【解决方案1】:

我也长期面临这个问题,但现在已经解决了。使用下面的代码

new AsyncTaskName().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

代码

new AsyncTaskName().execute();

它可以解决doInbackground延迟运行的问题。

【讨论】:

  • 这对我来说非常有效。请注意这是在 api 11 中添加的,警告来自:http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor, Params...)
  • 需要注意的是executeOnExecutor不能与11之前的API版本一起使用。见线程stackoverflow.com/questions/9119627/…
  • 这对我有用。我将补充一点,我们可以使用 support-v4 lib 中的 AsyncTaskCompat.executeParallel() 对所有 API 版本执行此操作。它处理 2 种情况:从 API 11+ 我们需要手动选择 THREAD_POOL_EXECUTOR,但在 API 11 之前 - 所有任务都是并行运行的。
  • 这不就是并行运行吗?它带有警告
  • 太棒了!在doInBackground 开始之前不再有延迟
【解决方案2】:

我们一般不关心 jvm 的任务调度。事实上,我们也不必费心。

如果需要在您的应用程序中尽快完成某些事情,请在构造函数本身中执行或使用 Asynctask 的 onPre(记住它在 UI 线程上执行)。

但我同意在 Android AsyncTask 中调用 doInBackgroud 有一些可疑之处 我自己亲眼目睹了在 onPre 之后没有调用 doInbackground。你也可以谷歌这个。很多人都面临过。 我开始使用传统线程。

我在核心使用传统线程编写了自己的 Asynctask,并模仿 onPre 和 onPost 我使用了 Handler。您也可以选择该选项。

【讨论】:

    【解决方案3】:

    区分创建和执行任务很重要。 (如您所见,ASyncTask 有一个单独的 execute() 方法和构造函数。)

    创建线程可能非常昂贵,因此您可能会发现提前创建任务,然后只在正确的时间执行它会产生更好的结果。

    如果后台操作可能会经常重复,您可能还会发现IntentService,在后台线程中一次处理一个请求,更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2016-01-29
      相关资源
      最近更新 更多