`
lovecontry
  • 浏览: 1042434 次
文章分类
社区版块
存档分类
最新评论

关于异步任务

 
阅读更多
 packagetest.me.layout;
  
  importandroid.app.Activity;
  importandroid.os.AsyncTask;
  importandroid.os.Bundle;
  importandroid.os.Handler;
  importandroid.os.Message;
  importandroid.os.SystemClock;
  importandroid.util.Log;
  importandroid.widget.TextView;
  importandroid.widget.Toast;
  
  /**一个使用异步任务的例子。一般来说一个异步任务只执行一次,这个例子有点非主流,任务结束后会触发下一次任务执行。
  *由任务task在屏幕上打印数字,第一次任务执行由主Activity的onCreate触发,每次任务结束后
  *设定下一次触发的时间,共执行5次。对于任务来说doInBackground()接收任务的参数params,并执行产生数字的动作,每一个数字
  *产生后调用一次publishProgress()来更新UI,这个函数本身也是异步的只是用来发个消息调用完成后立即返回,
  *而产生数字的动作在继续进行。更新界面的操作在onProgressUpdate()中设定。
  *所有的on函数都由系统调用,不能用户调用。
  *代码中使用Handler是为了能触发任务执行,android规定这种异步任务每次执行完就结束,若要重新执行需要new一个新的。
  *异步任务只能在UI线程里面创建和执行*/
  publicclasstestAsyncextendsActivity{
  privatefinalintMSG_TIMER=12;
  privateTextViewvText=null;
  
  @Override
  protectedvoidonCreate(BundlesavedInstanceState){
  //TODOAuto-generatedmethodstub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.test);
  vText=(TextView)findViewById(R.id.TextView01);
  vText.setText("Num...");
  
  newtask().execute("->");
  
  }
  
  //接收任务task发来的消息,触发一个新的任务
  privatefinalHandlerhandler=newHandler(){
  
  @Override
  publicvoidhandleMessage(Messagemsg){
  //TODOAuto-generatedmethodstub
  super.handleMessage(msg);
  
  switch(msg.what){
  caseMSG_TIMER:
  newtask().execute("->");
  break;
  }
  }
  
  };
  
  //任务执行次数
  privatestaticinttimes=1;
  
  //AsyncTask<>的参数类型由用户设定,这里设为三个String
  //第一个String代表输入到任务的参数类型,也即是doInBackground()的参数类型
  //第二个String代表处理过程中的参数类型,也就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息
  //传递给onProgressUpdate()一般用来更新界面
  //第三个String代表任务结束的产出类型,也就是doInBackground()的返回值类型,和onPostExecute()的参数类型
  privateclasstaskextendsAsyncTask<String,String,String>{
  
  
  
  //后台执行的耗时任务,接收参数并返回结果
  //当onPostExecute()执行完,在后台线程中被系统调用
  @Override
  protectedStringdoInBackground(String...params){
  //TODOAuto-generatedmethodstub
  //在这里产生数据,送给onProgressUpdate以更新界面
  Stringpre=params[0];
  
  for(inti=0;i<5;i++){
  publishProgress(pre+i);
  //这里是否需要停顿下
  SystemClock.sleep(1000);
  }
  
  return"任务结束";
  }
  
  //任务执行结束后,在UI线程中被系统调用
  //一般用来显示任务已经执行结束
  @Override
  protectedvoidonPostExecute(Stringresult){
  //TODOAuto-generatedmethodstub
  super.onPostExecute(result);
  
  Toast.makeText(testAsync.this,result,Toast.LENGTH_SHORT).show();
  
  //任务执行5次后推出
  if(times>5){
  return;
  }
  
  //设定下一次任务触发时间
  Messagemsg=Message.obtain();
  msg.what=MSG_TIMER;
  handler.sendMessageDelayed(msg,10000L);
  }
  
  //最先执行,在UI线程中被系统调用
  //一般用来在UI中产生一个进度条
  @Override
  protectedvoidonPreExecute(){
  //TODOAuto-generatedmethodstub
  super.onPreExecute();
  Toast.makeText(testAsync.this,"开始执行第"+times+"次任务:"+this,Toast.LENGTH_SHORT).show();
  times++;
  }
  
  
  //更新界面操作,在收到更新消息后,在UI线程中被系统调用
  @Override
  protectedvoidonProgressUpdate(String...values){
  //TODOAuto-generatedmethodstub
  super.onProgressUpdate(values);
  
  vText.append(values[0]);
  
  }
  
  }
  
  }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics