在调用AsyncTask :: execute之后,AsyncTask的doInBackground开始执行得太晚

时间:2012-09-13 10:55:37

标签: android android-asynctask

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

感谢任何帮助。

感谢

3 个答案:

答案 0 :(得分:39)

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

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

而不是代码

new AsyncTaskName().execute();

它可以解决后期运行doInbackground的问题。

答案 1 :(得分:2)

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

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

但我同意在Android AsyncTask中调用doInBackgroud时有些蠢事 我亲眼目睹了在onPre之后没有调用doInbackground。你也可以google这个。很多人都面对过它。 我转而使用传统线程。

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

答案 2 :(得分:1)

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

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

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