2014-09-03 69 views
1

我不明白這一點,這讓我非常沮喪。直到我離開活動時,AsyncTasks纔會啓動

我所有的長期運營都發生在AsyncTask s。例如,用戶以某種方式與應用程序交互,並將項目添加到列表中。這會導致AsyncTask觸發,將數據寫入sqlite3數據庫,然後刷新列表。

我最近將Android支持從2.3.3提升到了4.0。我創建了一個新的4.0仿真器,出於某種原因,我的所有AsyncTask似乎排隊,只有當用戶離開屏幕時纔會觸發!

這是怎麼回事?

代碼非常簡單。我在這裏沒有做任何有趣的事情。例如,這裏是一個AsyncTask火例如:

Log log = data.mFoodLog; 
log.setUserId(getUserId()); 
log.setDay(mBeginningOfToday.getTimeInMillis()/1000); 
log.setStatus(DbDefinitions.STATE_POSTING); 

(new SaveLogTask()).execute(new SaveObjectTaskParams(getApplicationContext(), log)); 

調試器顯示正在執行該代碼。我在doInBackground()方法中有另一個斷點,但是在我離開屏幕之前,斷點永遠不會被擊中。我還將Log.e消息放在該代碼的附近,並在沒有調試器的情況下運行它,以確保調試器沒有做任何奇怪的事情。 doInBackground()從來沒有被解僱,直到我離開Activity

回答

1

乍看起來似乎是@Cliffroot所說的,一個異步任務不會結束並排隊他們的ret(由於Android中的行爲改變)。

要在diferent線程執行它們使用:asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);

1

3.0版本開始,基本上AsyncTask的行爲已經改變。在2.3.3它同時執行AsyncTasks,但現在它順序執行。 所以你的問題可能是你有一個AsyncTask沒有完成,因爲這個事實,其他人甚至沒有開始(很難說沒有看到更多的代碼)。

+0

究竟是什麼在他們背後,使這一變化的邏輯是什麼? AsyncTasks似乎只是異步的,因爲它們不在主線程上運行。我不知道這件事。除非有一些真正理由讓我頭腦發呆,否則我真的有點不高興。 – Andrew 2014-09-03 15:35:09

+0

第一次引入時,AsyncTasks在單個後臺線程上被串行執行。從DONUT開始,將其更改爲允許多個任務並行操作的線程池。從HONEYCOMB開始,任務在單個線程上執行,以避免並行執行導致的常見應用程序錯誤。 來自developer.android.com – cliffroot 2014-09-03 15:37:25

+0

下面是我很困惑的地方:我的Android設備正在運行4.1,並且此行爲不會發生。我的'AsyncTasks'立即觸發,即使我有一個背景'AsyncTask',它可以使'Activity'(或者說'onResume'和'onPause'之間)的生活變得簡單。 – Andrew 2014-09-03 15:48:30

相關問題