android AsyncTask相關的一些面試題目
AsyncTask在android4.0之後android採用線程池來實現,最多開5個線程,所以幾個AsyncTask執行的時候順序是隨機的,
如果5個AsyncTask順序執行之後,又有一個AsyncTask,那最後一個會被掛起,當5個AsyncTask有一個被執行完以後最後一個會被插入執行
public class TestActivity extends Activity { @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test);new fetchServerVersionAndSupportOsHttpTasker().execute();new fetchServerVersionAndSupportOsHttpTasker1().execute();new fetchServerVersionAndSupportOsHttpTaske2().execute();}public class fetchServerVersionAndSupportOsHttpTasker extends AsyncTask { @Override protected String doInBackground(Object... params) { System.out.println("=============first doInBackground"); CommonHttpRequest.getForceUpgradeRelatedInfo(); return "aaaa"; } @Override protected void onPostExecute(String result) { if(!TextUtils.isEmpty(result)) { System.out.println("===============first postexecute"); } } } public class fetchServerVersionAndSupportOsHttpTasker1 extends AsyncTask { @Override protected String doInBackground(Object... params) { System.out.println("=============second doInBackground"); CommonHttpRequest.getForceUpgradeRelatedInfo(); return "bbb"; } @Override protected void onPostExecute(String result) { if(!TextUtils.isEmpty(result)) { System.out.println("===============second postexecute"); } } } public class fetchServerVersionAndSupportOsHttpTaske2 extends AsyncTask { @Override protected String doInBackground(Object... params) { System.out.println("=============third doInBackground"); //CommonHttpRequest.getForceUpgradeRelatedInfo(); return "ccc"; } @Override protected void onPostExecute(String result) { if(!TextUtils.isEmpty(result)) { System.out.println("===============third postexecute"); } } }}執行結果:
10-16 14:03:38.872: I/System.out(23132): =============third doInBackground10-16 14:03:38.872: I/System.out(23132): =============second doInBackground10-16 14:03:38.872: I/System.out(23132): =============first doInBackground10-16 14:03:38.892: I/System.out(23132): ===============third postexecute10-16 14:03:38.922: I/System.out(23132): ===============second postexecute10-16 14:03:38.922: I/System.out(23132): ===============first postexecute
堆棧的介紹:
堆棧就是這樣一種資料結構。它是在記憶體中開闢一個儲存地區,資料一個一個順序地存入(也就是“壓入——push”)這個地區之中。有一個地址指標總指向最後一個壓入堆棧的資料所在的資料單元,存放這個地址指標的寄存器就叫做堆棧指標。開始放入資料的單元叫做“棧底”。資料一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個資料壓入堆棧,就放在和前一個單元相連的後面一個單元中,堆棧指標中的地址自動加1。讀取這些資料時,按照堆棧指標中的地址讀取資料,堆棧指標中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則。
TASK1包含三個activity分別是:p,q,r;啟動順序為p-->q-->rTASK2包含兩個activity分別是:a,b;啟動順序為a-->b;TASK1首先啟動p,那麼這個p就是執行這個任務的根activity,任務也是定義在這個activity下的。通過屬性Manifest檔案中的activity屬性中的taskAffinity來定義。 (1)此時p啟動後就被壓入堆棧,因為此時堆棧中只有這一個activity,所以p處於棧底,也處於棧頂。此時使用者能夠看到的就是p介面。 (2)p啟動q後,q入棧。此時棧頂為q。q呈現的介面將p覆蓋,p進入後台運行(此時是activity生命週期的pause狀態)或者進入後台但不運行(此時是activity生命週期的stop狀態)。 (3)q啟動r後,r入棧。此時棧頂為r。r呈現的介面將q覆蓋,q進入後台運行。 (4)按back鍵後就是調用finish函數結束r (activity)的生命。此時r出棧,r的生命週期結束。 (5)繼續back鍵,結束q的生命,此時q出棧。 (6)繼續back鍵,結束p的生命,此時p出棧。 (7)此時棧內所有activity都已出棧,所以就會顯示HOME螢幕介面.
如果A->B->C->C如果C是singleTop或是singletask那麼最後一次C不會執行oncreate
A如果是singletop A->B->C->A那麼A會被重新執行oncreate,回退到CA如果是singleTask,則A不會執行oncreate,回退會回到home