AsyncTask是什么
- AsyncTask是一个抽象类,它是Android封装的一个轻量级(使用方便,代码简介)异步类,它可以在线程中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。
- AsyncTask是一个抽象泛型类,它有三个泛型参数
Params:开始异步执行时传入的参数类型
Progress:异步任务执行过程中,返回下载的进度值的类型
Result:异步任务执行完成后,返回结果类型
如果不需要传递具体的参数,则可以用Void来代替
AsyncTask怎么用
在Activity中采用内部类继承AsyncTask使用,让后使用里面的方法
class DownlondTask extends AsyncTask<String, String,String>//括号内为三个泛型参数,在这里用来String
AsyncTask各个方法的作用
onPreExecute():这个方法会在后台任务开始执行之间调用,在主线程执行。用于进行一些界面上的初始化操作,比如显示一个进度条对话框等
doInBackground(Params):在这个方法中所有的代码就会在子线程中运行
注意的是在这个方法中是不能对UI进行操作的
onPostExecute(Result):该方法当doInBackground执行完毕后并通过return语句返回时调用,返回的参数会传递到此方法中
onProgressUpdate(Progress…):调用publishProgress()方法后,这个参数就会很快的被调用,方法中携带的参数就是在后台任务中传递过来的。 在这个方法中可以进行对UI的操作,在主线程中进行,利用参数中的数值就可以对界面元素进行相应的更新
上面几个方法的调用顺序:
onPreExecute() –> doInBackground() –> publishProgress() –> onProgressUpdate() –> onPostExecute()
什么是泛型参数
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
什么是长度可变的参数列表
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tv_show.setText(values[0]);
}
上述代码中的String… values,String…可以说是一个长度可变的String类型的参数,所以values我们要写成一个数组
public void add(int...ints){
}
add(1,2,3,4,5)
我们可以在 add方法中无限的添值
案列解析–倒计时Demo
package com.example.dfcn.sexmouth;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class AsyncTaskActivity extends AppCompatActivity {
private TextView tv_show;
private Button btn_start;
private int time=10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
tv_show=findViewById(R.id.tv_show);
btn_start=findViewById(R.id.btn_start);
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DownlondTask().execute();//开始执行AsyncTask
}
});
}
class DownlondTask extends AsyncTask<String, String,String>{
@Override
/**
* 在这个方法中所有的代码就会在子线程中运行
* 注意的是在这个方法中是不能对UI进行操作的
*/
protected String doInBackground(String... strings) {
while (time>0) {
publishProgress(time+"");
try {
Thread.sleep(1000);
time--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String s="下载完成";
return String.valueOf(s);
}
@Override
/**
* 该方法当doInBackground执行完毕后并通过return语句返回时调用,返回的参数会传递到此方法中
*/
protected void onPostExecute(String s) {
super.onPostExecute(s);
tv_show.setText(s);
}
@Override
/**
* 调用publishProgress()方法后,这个参数就会很快的被调用,方法中携带的参数就是在后台任务中传递过来的。
* 在这个方法中可以进行对UI的操作,在主线程中进行,利用参数中的数值就可以对界面元素进行相应的更新
*/
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tv_show.setText(values[0]);
}
}
}