我不明白這一點,這讓我非常沮喪。直到我離開活動時,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
。
究竟是什麼在他們背後,使這一變化的邏輯是什麼? AsyncTasks似乎只是異步的,因爲它們不在主線程上運行。我不知道這件事。除非有一些真正理由讓我頭腦發呆,否則我真的有點不高興。 – Andrew 2014-09-03 15:35:09
第一次引入時,AsyncTasks在單個後臺線程上被串行執行。從DONUT開始,將其更改爲允許多個任務並行操作的線程池。從HONEYCOMB開始,任務在單個線程上執行,以避免並行執行導致的常見應用程序錯誤。 來自developer.android.com – cliffroot 2014-09-03 15:37:25
下面是我很困惑的地方:我的Android設備正在運行4.1,並且此行爲不會發生。我的'AsyncTasks'立即觸發,即使我有一個背景'AsyncTask',它可以使'Activity'(或者說'onResume'和'onPause'之間)的生活變得簡單。 – Andrew 2014-09-03 15:48:30