背景
AsyncTask 是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。
主要方法
AsyncTask 主要有一下几个方法:
- onPreExecute : 开始执行前调用,初始化工作。该任务开始前调用,一般这时候做显示进度框之类的
- doInBackground:后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。这里是进入子线程.
- onPostExecute: 在主线程中运行,并在在doInBackground之后调用。处理结果的地方【主线程】,一般用于更新UI
- onProgressUpdate:在publishProgress方法调用之后在主线程中运行,可以更新UI。
- onCancelled: 在主线程中,取消操作。
用法实例
onPreExecute:
/**
* Runs on the UI thread before.
* 开始执行前【主线程】【初始工作,因为在UI主线程】
* 即在该任务开始前调用,一般这时候做显示进度框之类的。
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
mBar.setProgress(0);
mText.setText("0%");
}
这边主要做一些初始化和开始前的操作。
doInBackground:
/**
* 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。这里是进入子线程.
* This method can call {@link #publishProgress} to publish updates on the UI thread,这个方法可以调用publishProgress来更新主线程。
* 这里参数是execute执行的参数,也就是AsyncTask<Params, Progress, Result>里面的 Prarms
* 返回的结果就是AsyncTask<Params, Progress, Result> 里的Result。
* @param params
* @return
*/
@Override
protected String doInBackground(Integer... params) {
for(int i=0;i<=params[0];i++){
/**
* 如果当前标记为cancel,则跳出循环,直接return.
*/
if(this.isCancelled()){
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
return "success";
}
这里的参数是从execute传进来的,也就是AsyncTask<Params, Progress, Result>里面的 Prarms,而返回的结果就是AsyncTask<Params, Progress, Result> 里的Result.
onPostExecute:
/**
* Runs on the UI thread after doInBackground ,The specified result is the value returned by doInBackground.
* 在主线程中运行,并在在doInBackground之后调用。处理结果的地方【主线程】,一般用于更新UI。
* 任务执行的结果作为此方法的参数返回,也就是可以使用 doInBackground 得到的结果来更新UI。
* @param s
*/
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mText.setText(s);
}
这里的参数是doInBackground 返回的result。
onProgressUpdate:
/**
* Runs on the UI thread after {@link #publishProgress} is invoked.
* 在publishProgress方法调用之后在主线程中运行。
* 参数是从publishProgress里传进来的。
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mText.setText(values[0] + "%");
mBar.setProgress(values[0]);
}
在doInBackground中调用publishProgress之后即可调用改方法。
onCancelled:
/**
* 在主线程中,取消
*/
@Override
protected void onCancelled() {
super.onCancelled();
LogHelper.i("cancel cancel");
}
/**
* 在主线程中,取消
*/
@Override
protected void onCancelled(String s) {
super.onCancelled(s);
LogHelper.i("cancel cancel " + s);
}
这是几个主要方法的实现。调用的时候直接execute();
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTask = new TestTask();
mTask.execute(100);
}
});
完全代码
public class AsynTaskActivity extends BaseActivity {
private Button mBtn;
private TextView mText;
private ProgressBar mBar;
private TestTask mTask;
@Override
protected void loadViewLayout() {
setContentView(R.layout.test_asyn_task_activity);
}
@Override
protected void loadIntent() {
}
@Override
protected void bindViews() {
mBtn = (Button) findViewById(R.id.start);
mText = (TextView) findViewById(R.id.text);
mBar = (ProgressBar) findViewById(R.id.pba);
}
@Override
protected void processLogic(Bundle savedInstanceState) {
}
@Override
protected void setListener() {
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTask = new TestTask();
mTask.execute(100);
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
//将task的状态标记为cancel
if(mTask!=null&&
mTask.getStatus() == AsyncTask.Status.RUNNING){
mTask.cancel(true);
}
}
return false;
}
class TestTask extends AsyncTask<Integer,Integer,String>{
/**
* Runs on the UI thread before.
* 开始执行前【主线程】【初始工作,因为在UI主线程】
* 即在该任务开始前调用,一般这时候做显示进度框之类的。
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
mBar.setProgress(0);
mText.setText("0%");
}
/**
* 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。这里是进入子线程.
* This method can call {@link #publishProgress} to publish updates on the UI thread,这个方法可以调用publishProgress来更新主线程。
* 这里参数是execute执行的参数,也就是AsyncTask<Params, Progress, Result>里面的 Prarms
* 返回的结果就是AsyncTask<Params, Progress, Result> 里的Result。
* @param params
* @return
*/
@Override
protected String doInBackground(Integer... params) {
for(int i=0;i<=params[0];i++){
/**
* 如果当前标记为cancel,则跳出循环,直接return.
*/
if(this.isCancelled()){
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
return "success";
}
/**
* Runs on the UI thread after doInBackground ,The specified result is the value returned by doInBackground.
* 在主线程中运行,并在在doInBackground之后调用。处理结果的地方【主线程】,一般用于更新UI。
* 任务执行的结果作为此方法的参数返回,也就是可以使用 doInBackground 得到的结果来更新UI。
* @param s
*/
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mText.setText(s);
}
/**
* Runs on the UI thread after {@link #publishProgress} is invoked.
* 在publishProgress方法调用之后在主线程中运行。
* 参数是从publishProgress里传进来的。
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mText.setText(values[0] + "%");
mBar.setProgress(values[0]);
}
/**
* 在主线程中,取消
*/
@Override
protected void onCancelled() {
super.onCancelled();
LogHelper.i("cancel cancel");
}
/**
* 在主线程中,取消
*/
@Override
protected void onCancelled(String s) {
super.onCancelled(s);
LogHelper.i("cancel cancel " + s);
}
}
}