Android 多线程之AsyncTask
AsyncTask主要用于UI线程普通异步操作中,要想使用,需继承此类,然后在继承的子类中进行相关操作,子类必须至少继承重写doInBackground方法。
1. 子类代码示例:
Public ClassSubAsyncTask extends AsyncTask<Integer,Integer,String>{
private TextView tv_numUpdate;
Public TestAsyncTask(TextView tv_num){
this.tv_numUpdate = tv_num;
}
//该方法并不运行在UI线程当中,所以在该方法当中,不能对UI当中的控件进行设置和修改
//主要用于进行异步操作。
@Override
protected String doInBackground(Integer...params) {
int i = 0;
for(i = 1; i <= params[0]; i++){
Thread.sleep(1000);
//用于发布更新消息
publishProgress(i);
}
return i + params[0].intValue() +"";
}
//在doInBackground方法执行结束之后再运行,并且运行在UI线程当中。
//主要用于将异步任务执行的结果展示给客户
@Override
protected void onPostExecute(Stringresult) {
Log.i(“TEST”,"异步操作执行结束" + result);
}
//该方法运行在UI线程当中,主要用于进行异步操作之前的UI准备工作
@Override
protected void onPreExecute() {
Log.i(“TEST”,"开始执行异步操作");
}
//在doInBackground方法当中,每次调用publishProgress()方法之后,都会触发该方法
//用于在异步任务执行的过程当中,对用户进行提示,例如控制进度条、文本提示等
@Override
protected void onProgressUpdate(Integer...values) {
this.tv_numUpdate .setText(values[0].toString());
}
}
2. 调用:在UI主线程中调用
SubAsyncTask task = new SubAsyncTask((TextView) findViewById(R.id.tv_numUpdate));//传入的是一个文本TextView对象
task.execute(10);//执行,传入的是第一个整形参数,此方法必须有
3. AsyncTask<Params,Progress, Result>:继承的子类采用泛型的形式,其中第一个参数类型对应的doInBackground()方法的输入参数类型;第二个参数类型对应的是onProgerssUpdate()方法的输入参数类型;第三个参数类型对应的是onInBackground()的返回值类型和onPostExecute()的输入参数值类型。
4. 继承自AsyncTask的子类注意事项:
首先,执行的是onPreExecute()方法,此方法对应的UI主线程;
再执行doInBackground()方法,此方法对应的是异步操作,是另外一个线程,主要用于异步更新控件信息,此方法中采用publishProgress()方法发布更新消息,与onProgressUpdate()方法配合使用,更新UI线程控件信息;
最后是onPostExecute()方法,该方法对应的是UI主线程;
另外,doInBackground()的返回值是onPostExecute()方法的输入参数值。
备注:以上资料整理来自Mars老师的视频资料和android api 文档说明,推荐学习android的孩子们,看看mars老师的视频,不错。