AsyncTask
概念
AsyncTask是android提供的轻量级异步类,就是一个封装过的后台任务类。它提供了接口返回当前异步操作的执行进度和执行结果。使用时直接将需要进行异步操作的类直接继承AsyncTask即可。
参数
AsyncTask定义了三种泛型类型 | |
---|---|
Params | 启动任务时执行的输入参数 |
Progress | 任务执行的进度(百分比) |
Result | 返回的执行结果 |
需要重写的方法
必须重写的方法 | |
---|---|
doInBackground(Params…) | 需要执行的耗时的线程操作 |
onPostExecute(Result) | 此方法在主线程中执行,用来处理返回的结果 |
可能重写的方法 | |
onProgressUpdate(Progress…) | 此方法在主线程执行,用来显示任务执行的进度。 |
onPreExecute() | 这是用户调用Excute时的接口,当任务执行开始之前调用此方法,可以在这里显示提示信息。 |
onCancelled() | 用户调用取消时,要做的操作 |
代码示例
xml比较简略,不贴出了,其中包括TextView,ProgressBar,Button各一个。
MainActivity.class
public class MainActivity extends Activity {
private Button mButton;
private ProgressBar mProgressBar;
private TextView mTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化
mButton= (Button)findViewById(R.id.btn_start);
mProgressBar= (ProgressBar)findViewById(R.id.pb_log);
mTextView= (TextView)findViewById(R.id.tv_log);
//绑定mButton单击事件
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//AsyncTask必须在UI线程中声明
TestAsyncTask mAsyncTask = new TestAsyncTask(textView, progressBar);
//开始执行异步线程--->调用了onPreExecute()
mAsyncTask.execute(1000);
}
});
}
}
TestAsyncTask.class
public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {
private TextView textView;
private ProgressBar progressBar;
public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar;
}
/**
* 该方法并不运行在UI线程当中,主要用于异步操作
* 该方法中不能对UI当中的空间进行设置和修改
*/
@Override
protected String doInBackground(Integer... params) {
int i = 0;
for (i = 10; i <= 100; i+=10) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//触发onProgressUpdate()更新UI中的ProgressBar
publishProgress(i);
}
return i + params[0].intValue() + "";
}
/**
* result接收doInBackground的返回值)
* 此方法在doInBackground方法执行结束之后运行
* 此方法中可以执行UI操作
*/
@Override
protected void onPostExecute(String result) {
textView.setText("End" + result);
}
@Override
protected void onPreExecute() {
textView.setText("Start");
}
@Override
protected void onProgressUpdate(Integer... values) {
int vlaue = values[0];
progressBar.setProgress(vlaue);
}
}
注意
- Task的实例必须在UI thread中创建;
- execute方法必须在UI thread中调用;
- 不要手动的调用onPreExecute(), onPostExecute(Result)
- doInBackground(Params…), onProgressUpdate(Progress…)这几个方法;
- 该task只能被执行一次,否则多次调用时将会出现异常;
AsyncTask & Handler
它们存在的意义是一样的:Handler和AsyncTask,都是为了不阻塞UI线程才存在。为了降低开发难度,android提供了AsyncTask后台任务类。
AysncTask | |
---|---|
优点 | 缺点 |
操作简单 | AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException。–>由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。 |
编写快捷 | 在使用多个异步操作并需要进行Ui变更时,就变得复杂起来. |
handler | |
---|---|
优点 | 缺点 |
结构清晰,功能定义明确 | 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) |
多个后台任务时,简单,清晰 |
转载请注明出处:http://blog.csdn.net/zifeng1203s/article/details/44201889