2012-09-13 70 views
9

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

任何帮助表示赞赏。

感谢

+0

国际海事组织,通常它会立即执行,如果还有另一个线程正在运行,将使它滞后,所以最好检查你的线程并且同步它们。 – Tom

回答

2

我们一般不会理会由JVM任务调度。事实上,我们也不需要打扰。

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

但我同意doInBackgroud调用Android AsyncTask 我自己曾目睹doInbackground在onPre之后没有被调用。你也可以谷歌这一点。很多人都面对过它。 我搬到使用传统线程。

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

1

区分创建和执行任务很重要。 (一ASyncTask有独立的​​方法,以及一个构造函数,因为你已经注意到了。)

创建一个线程可能相当昂贵,所以你可能会发现,创建提前的任务,那么只有在执行它正确的时间,给出更好的结果。

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

30

我也长期面对这个问题,但现在解决了。使用下面

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

不是代码

new AsyncTaskName().execute(); 

代码能解决运行doInbackground晚的问题。

+1

这对我来说非常合适。请注意这是在api 11中添加的,警告来自:'http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor,Params ...') – Jayrox

+1

它必须注意的是,executeOnExecutor不能用于早期的API版本11.请参阅线程http://stackoverflow.com/questions/9119627/android-sdk-asynctask-doinbackground-not-running-subclass/23678665#23678665 –

+0

@米兰舒克拉:非常感谢你:-) –

相关问题