Android AsyncTaskに関する面接問題


AsyncTaskはandroid 4.0以降androidはスレッドプールで実現され、最大5スレッドまで開くので、いくつかのAsyncTaskが実行されるときの順序はランダムで、
5つのAsyncTaskが順次実行された後、もう1つのAsyncTaskがある場合、最後の1つは保留され、5つのAsyncTaskの1つが実行された後、最後の1つが挿入されて実行されます.
public class TestActivity extends Activity {

	
	 @Override
	protected 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 doInBackground
10-16 14:03:38.872: I/System.out(23132): =============second doInBackground
10-16 14:03:38.872: I/System.out(23132): =============first doInBackground
10-16 14:03:38.892: I/System.out(23132): ===============third postexecute
10-16 14:03:38.922: I/System.out(23132): ===============second postexecute
10-16 14:03:38.922: I/System.out(23132): ===============first postexecute

スタックの説明:
             。              ,           (   “  ——push”)      。                            ,                    。           “  ”。         ,      “  ”。       ,          ,                   ,            1。       ,               ,              1。      “  pop”。             。 
TASK1    activity   :p,q,r;     p-->q-->r
TASK2    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を再実行し、Cに戻る
A singleTaskの場合、Aはoncreateを実行せず、ロールバックはホームに戻ります