13

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

任何帮助表示赞赏。

谢谢

4

3 回答 3

39

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

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

而是代码

new AsyncTaskName().execute();

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

于 2013-03-13T12:02:12.423 回答
2

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

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

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

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

于 2012-09-13T11:06:38.913 回答
1

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

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

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

于 2012-09-13T11:07:18.773 回答