AsyncTask是将Thread+Handler进行了封装,方便我们使用,其主要方法有五个:onPreExcute()、doInbackground()、onProgressUpdate()、onPostExcute()、onCancelled()
onPreExcute():执行线程前的操作
doInbackground():接收执行参数,执行任务中的耗时操作,返回操作结果
onProgressUpdate():在主线程中显示执行线程的进度
onPostExcute():接收线程执行任务结果,将结果更新到UI组件
onCancelled():取消执行线程的操作
AsyncTask有三个参数:Parmas、Progress、Result(三个参数均可以不传,不传的话均可用Object代替,或者就写为Parmas、Progress、Result):
Parmas:传递到AsyncTask中的参数,在doInBackground中可以调用
Progress:在onProgressUpdate中可以调用
Result:onPostExecute中调用
代码如下:
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="dzx.ctsi.asynctask_master.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical">
<Button
android:id="@+id/btn_load"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="点我加载"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/txv_describe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="准备加载"/>
<ProgressBar
android:id="@+id/pgb_loading"
android:layout_width="match_parent"
android:layout_height="2dp"
android:progress="0"
android:max="100"
style="?android:attr/progressBarStyleHorizontal"/>
<Button
android:id="@+id/btn_cancle"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="cancle"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
</RelativeLayout>
类:
public class MainActivity extends AppCompatActivity {
Button btn_load,btn_cancle;
TextView txv_describe;
ProgressBar pgb_loading;
private MyTask myTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
btn_load = findViewById(R.id.btn_load);
btn_cancle = findViewById(R.id.btn_cancle);
txv_describe = findViewById(R.id.txv_describe);
pgb_loading = findViewById(R.id.pgb_loading);
myTask = new MyTask();
}
private void initData() {
btn_load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myTask.execute();
btn_load.setClickable(false);
}
});
btn_cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myTask.onCancelled();
}
});
}
private class MyTask extends AsyncTask<String,Integer,String> {
//执行线程任务前的操作
@Override
protected void onPreExecute() {
txv_describe.setText("准备加载");
super.onPreExecute();
}
//接收输入参数、执行任务中的耗时操作、返回线程执行的结果
@Override
protected String doInBackground(String... params) {
int count = 0;
int length = 1;
while (count <= 99){
count = count+length;
publishProgress(count);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
//在主线程显示执行线程的进度
@Override
protected void onProgressUpdate(Integer... progress) {
pgb_loading.setProgress(progress[0]);
txv_describe.setText("loading..." + progress[0] + "%");
}
//接收线程任务执行结果,将结果更新到UI组件
@Override
protected void onPostExecute(String result) {
txv_describe.setText("加载完毕");
super.onPostExecute(result);
}
//将异步任务设置为:取消状态
@Override
protected void onCancelled() {
txv_describe.setText("已取消");
pgb_loading.setProgress(0);
super.onCancelled();
}
}
}
注意:AsyncTask的execute()方法只能调用一次,重复调用会报错,但是可以创建多个AsyncTask的实例来实现多次调用