1.Asynctask 介绍
异步任务类。任务在后台线程上运行,结果在UI线程上显示。
一个抽象类。需要子类来实现。
使得使用UI 线程更加正常和简单。
就是一个封装过的后台任务类。
2.详细介绍
(1)三种泛型参数
Params:执行之前传入的参数,比如Http请求的URL;
Progress:后台运行时更新的参数(执行的百分比);
Result:执行之后返回的参数(结果)。
(2)要重写的方法
doInBackgroud:后台执行,比较耗时的操作都可以放在这个里面。这里不能直接操作UI。在后台执行,完成任务的主要工作,通常需要较长时间。在执行过程中可以调用publishProgress()来更新任务进度。
onPostExecute:此方法在主线程内执行,任务执行的结果作为此方法的参数。在这里可以处理UI。
(3)别的方法
onProgressUpdate:使用进度条来增加用户的体验。在主线程内执行,用于显示任务执行进度。
onPreExecute:最终用户调用execute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度条对话框。
onCancelled:用户调用取消时,要做的操作。
3.准则
(1)AsyncTask实例必须在UI Thread中创建;
(2)execute方法必须在UI Thread中调用;
(3)不要手动的调用
onPreExecute,doInBackgroud,onProgressUpdate,onPostExecute这几个方法;
(4)该Task只能被执行一次,否则多调用几次会出现异常。
4.说明
doInBackgroud方法在后台线程执行,不能操作UI。
onPreExecute,onProgressUpdate,onPostExecute方法在UI Thread中调用,在其中能够操作UI。
doInBackgroud的返回值传递给onPostExecute。
5.状态
有3种状态:
PENDING
RUNNING
FINISHED
6.AsyncTask 与线程及线程池的关系
AsyncTask会开启一个新线程,使用线程池技术。
7.实例
(1)布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/showBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/show" />
<Button
android:id="@+id/hideBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hide" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:visibility="invisible"
android:max="10" />
</LinearLayout>
(2)耗时操作
public class LongTimeOperate {
//模拟耗时操作
public void operate(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(3)AsyncTask子类
public class MyAsyncTask extends AsyncTask<Integer, Integer, String> {
private ProgressBar progressBar = null;
private TextView textView = null;
private LongTimeOperate operate = null;
public MyAsyncTask() {
}
public MyAsyncTask(ProgressBar progressBar, TextView textView) {
this.progressBar = progressBar;
this.textView = textView;
}
//后台执行任务,参数是在execute方法中传递进来,onPreExecute方法执行后执行此方法
@Override
protected String doInBackground(Integer... arg0) {
// TODO Auto-generated method stub
int value = arg0[0];
Log.d("zmq","doInBackground value = "+value);
for (int i = 0; i < value; i++) {
operate.operate();
publishProgress(i);
}
return "任务结束啦";
}
//后台任务结束后,调用UI线程,result是doInBackground中返回的值,在doInBackground后执行
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
textView.setText(result);
}
// 初始化以及设置一些任务,在UI线程的中调用execute方法后执行此方法
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
operate = new LongTimeOperate();
textView.setText("任务开始啦");
}
//在执行任务的过程中更新显示数据,UI线程的publishProgress执行之后调用此方法
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
int value = values[0];
progressBar.setProgress(value+1);
}
}
(4)MainActivity
public class MainActivity extends Activity implements OnClickListener {
private Button showBtn = null;
private Button cancelBtn = null;
private Button hideBtn = null;
private ProgressBar progressBar = null;
private TextView textView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
showBtn.setOnClickListener(this);
hideBtn.setOnClickListener(this);
}
private void findViews() {
showBtn = (Button) findViewById(R.id.showBtn);
hideBtn = (Button) findViewById(R.id.hideBtn);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
textView = (TextView) findViewById(R.id.textView);
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
switch (view.getId()) {
case R.id.showBtn:
textView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE);
MyAsyncTask myAsyncTask = new MyAsyncTask(progressBar,textView);
myAsyncTask.execute(10);
break;
case R.id.hideBtn:
textView.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.INVISIBLE);
break;
}
}
}