android AsyncTask相关的一些面试题目

AsyncTask在android4.0之后android采用线程池来实现,最多开5个线程,所以几个AsyncTask执行的时候顺序是随机的,

如果5个AsyncTask顺序执行之后,又有一个AsyncTask,那最后一个会被挂起,当5个AsyncTask有一个被执行完以后最后一个会被插入执行

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<Object, Integer, String> {

	        @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<Object, Integer, String> {

	        @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<Object, Integer, String> {

	        @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,回退会回到home


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值