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