2012-05-05 23 views
3

我正在從我的UI線程(在我的Activity的 onCreate()處理程序)中實例化並執行AsyncTask。我保證活動 不會由於配置更改而重新啓動(它會忽略方向更改,例如, )。我使用asynctask.execute(),然後UI 線程做了一些工作,然後調用asynctask.get(...)以在Activity.onCreate()結束之前同步。部分順序:AsyncTask.get()和onPostExecute()?

根據日誌,我asynctask.onPostExecute()被調用年齡 asynctask.get()返回後。更確切地說,在Activity.onResume(!)返回後,onPostExecute被稱爲 。 (所以它確實被調用,我的方法定義是OK,我也使用@Override。)

我在某處讀到它,因爲onPostExecute()帖子在UI線程的 處理程序中,UI線程必須是準備好了 - 爲什麼 在這種情況下是不是準備好了?我的應用程序從定位更改開始,但由於清單中的設置,它不會導致任何配置更改。

是否有任何保證何時會onPostExecute()被調用相對 到 asynctask.get()?

回答

3

根據日誌,我的asynctask.onPostExecute()在asynctask.get()返回後被調用年齡。更確切地說,在Activity.onResume(!)返回後調用onPostExecute。

get()只根據我對源代碼的閱讀等待doInBackground()完成。

當onPostExecute()被相對於asynctask.get()調用時,是否有任何保證?

將在get()返回之後的某個時間根據我對源代碼的閱讀而被調用。但是,這不是「保證」,因爲這種行爲沒有記錄,因此可能會發生變化。

+0

這真的很有趣。事實上,文檔避免了指定,但是這會使onPostExecute()非常不切實際。文檔應該至少聲明onPostExecuted()被調用時不能保證。我原先假定它在get()返回之前被執行。我試圖深入研究Android的源代碼,但由於get()使用的是非常低級別的服務,因此找到onPostExecute()和get()的期望順序(如果有的話)並不幸運。 –

+1

@ThomasCalc:「但是這使得onPostExecute()非常不切實際,然後」 - 不是真的,因爲你是我在三年中遇到的第一個使用'get()'的人。 – CommonsWare

+0

我在應用程序的設置階段使用Asynctask。它從外部存儲讀取數據。但是應用程序只有在加載所有數據後才能顯示其歡迎屏幕。請注意,它沒有太多數據,否則它實際上會阻塞解決方案(由於get()),但是在數據加載時,GUI可以準備其佈局(setcontentview等),並且在onCreate ),他們同步。 –