一、异步任务介绍

 多线程编程Handler刷新UI界面​这是我们之前学习的一种利用多线程的方式,通过子线程向主线程发送消息的方式实现的UI界面的刷新,实际上为解决UI的界面刷新问题,Android提供了好几种方案比如:View.post、View.postDelayed、Activity.runOnUiThread。但是上面的方法都比较麻烦,而异步任务(AsyncTask)作为Handler的封装类,正好可以简化这种操作。 
 异步任务的实现原理也是基于异步消息处理机制的,就是我们在多线程编程Handler中所介绍的Message、MessageQueue、Handler、Looper。

二、Async的参数和方法

1、参数

AsyncTask是一个抽象类,我们需要一个class去继承,下面我们来看下传递参数。

class Async extends AsyncTask<Params, Progress, Result>{}

1、Params:启动任务执行传入参数的类型(用于doInBackground()(后台任务)的参数)
2、Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。(泛型不能使用简单数据类型)
3、Result:当任务执行完毕后如果需要对结果执行返回,返回的就是这个类型的参数

2、方法

1、onPreExcute():该方法在后台任务开始执行之前调用该方法,可以用于初始化界面。
1、doInBackground(Params…):这个方法的所有代码都会在子线程中运行,我们应该在这里处理所有的耗时任务。任务一旦完成可以通过return语句来将任务的执行结果返回。注意:在这个方法里不可以进行更新UI的操作,如果需要更新UI元素,可以调用publishProgress(progress)。

2、onProgressUpdate(Progress…values):当在后台任务中调用了publishProgress(progress)方法之后,这个方法很快就会被调用,方法中携带的参数就是后台运行传递过来的。
3、onPostExecute(Result…values):当任务执行完毕并通过return语句进行返回时,就会调用这个方法。可以利用一些返回数据进行更新UI。

三、使用范例

使用步骤

1、写一个继承AsyncTask的class
2、在该class中通过onProgressUpdate刷新界面
3、在Activity中调用通过new AsyncTask().execute();

思路

activity通过new一个继承AsyncTask的class的对象,在该对象中会调用相关的方法对UI主界面的progressbar的进度和Button的文本内容进行刷新。

代码

package com.example.myasynctask;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity
private Button mbtn_start;
private ProgressBar mprogressbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mbtn_start=(Button) findViewById(R.id.mbtn);
mprogressbar=(ProgressBar) findViewById(R.id.progressbar);
mbtn_start.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
MyTask mytask=new MyTask();
mytask.execute();

}
});
}
class MyTask extends AsyncTask<Integer, Integer, String>{

protected String doInBackground(Integer... params) {
int count=0;
while(count<101){
count++;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
publishProgress(count);//更新UI界面
}
return "已经完成";
}

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
mbtn_start.setText(result);
}
@Override
protected void onProgressUpdate(Integer... values) {
// int count=Integer.parseInt(values[0]);
// mprogressbar.setProgress(count);
int count=values[0];
mprogressbar.setProgress(count);
super.onProgressUpdate(values);
}
}
}

效果

当progress进度条到达100之后,Button是的文本内容将会变成“已经完成”