2012-09-13 72 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

@米蘭舒克拉:非常感謝你:-) –

相關問題