packageyjm.com.testcontrol;importandroid.app.Activity;importandroid.os.AsyncTask;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ProgressBar;importandroid.widget.TextView;importjava.io.Serializable;publicclassTestActivityextendsActivityimplementsView.OnClickListener{TextViewtv1;TextViewtv2;Buttonbtn1;Buttonbtn2;Buttonbtn3;Buttonbtn4;ProgressBarpro1;ATaskatask;//创建UI线程更新数据,主要是UI控件不支持异步线程更新,必须所有的值都在UI线程值才能修改HandlermyHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseR.id.tv1:tv1.setText(""+msg.arg1+"");break;caseR.id.tv2:tv2.setText(""+msg.arg2+"");}super.handleMessage(msg);}};classUiInfoimplementsSerializable{privateStringuiName;privateStringuiActivity;privateStringuiUrl;publicvoidsetUiName(StringuiName){this.uiName=uiName;}publicvoidsetUiActivity(StringuiActivity){this.uiActivity=uiActivity;}publicvoidsetUiUrl(StringuiUrl){this.uiUrl=uiUrl;}publicStringgetUiName(){returnuiName;}publicStringgetUiActivity(){returnuiActivity;}publicStringgetUiUrl(){returnuiUrl;}}classTheadTestextendsThread{HandlermyHandler;Messagemsg;publicTheadTest(Handlerhandler){this.myHandler=handler;}@Overridepublicvoidrun(){for(inti=0;i<100;i++){try{sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}//此message对象必须是新new的。如果重复发送同一个,就会卡住报错。msg=newMessage();msg.what=R.id.tv1;msg.arg1=i;myHandler.sendMessage(msg);}}}classATaskextendsAsyncTask<Bundle,String,String>{@OverrideprotectedStringdoInBackground(Bundle...params){//Bundle可以进行对象间的传递,此为后台线程不是UI线程Bundlebundle=params[0];UiInfouiInfo=(UiInfo)bundle.getSerializable("uiinfo");for(inti=0;i<100;i++){try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}publishProgress(i+"");}return"执行成功!!";}@OverrideprotectedvoidonPreExecute(){//doInBackground执行的准备操作,执行在UI线程的准备操作System.out.println("doInBackgroup执行前操作..");tv2.setText("开始执行更新..");}@OverrideprotectedvoidonPostExecute(Strings){//doInBackground后台执行完毕后执行,运行该方法System.out.println("doInBackgroup执行后操作..");tv2.setText(s+"");}@OverrideprotectedvoidonProgressUpdate(String...values){//doInBackground后台线程运行publishProgress()向UI线程推送数据onProgressUpdate接收数据tv2.setText(values[0]+"%");pro1.setProgress(Integer.parseInt(values[0]));}}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main_test);/**/tv1=(TextView)findViewById(R.id.tv1);tv2=(TextView)findViewById(R.id.tv2);pro1=(ProgressBar)findViewById(R.id.pro1);btn1=(Button)findViewById(R.id.btn1);btn2=(Button)findViewById(R.id.btn2);btn3=(Button)findViewById(R.id.btn3);btn4=(Button)findViewById(R.id.btn4);btn1.setOnClickListener(this);btn2.setOnClickListener(this);btn3.setOnClickListener(this);btn4.setOnClickListener(this);}@OverridepublicvoidonClick(Viewview){if(view.getId()==R.id.btn1){tv1.setText("btn1_test..开始.");newTheadTest(myHandler).start();}//UI线程内部进行UI数据量更新测试按钮2进行测试if(view.getId()==R.id.btn2){for(inti=0;i<10000;i++){tv2.setText("btn2_test...:"+i);}}if(view.getId()==R.id.btn3){atask=newATask();Bundlebundle=newBundle();UiInfouiInfo=newUiInfo();uiInfo.setUiName("processBar");bundle.putString("hello","hello");bundle.putSerializable("uiinfo",uiInfo);atask.execute(bundle);}if(view.getId()==R.id.btn4){atask.cancel(true);}}}


tv1 在主线程 1-99显示

tv1 异步更新值,通过handler显示值

AsyncTask测试 ,遇到几个问题,并不很好用,1.当前activity推出后,后台执行的线程仍然在执行。

再次打开程序仍然要等待上一次的任务执行完毕后在执行。

2.AsyncTask是串行执行的,就是创建多个 任务 会在任务池里 按照 先进先出的顺序进行执行任务。当前任务执行完毕后 才能执行下一个任务。再就是取消操作,如果后台有线程在进行循环操作,任务取消后,后台程序仍然会在执行。只是不会向UI线程 更新数据,执行并行需要

atask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,bundle);

API 至少11的版本才能运行这个方法。