一.什么是AsyncTack
1. AsyncTask是Andorid提供的轻量级的异步类
2. 为了降低异步通信的开发难度,提供了AsyncTack
3. AsyncTack直接继承object类,位于andorid.os包
4. 使用AsyncTack可以忽略looper,Handler,等复杂对象,更能便捷的完成异步耗时操作
二.如何使用AsyncTack
首先创建匿名内部类,然后建立AsyncTack的三种泛型参数,重写抽象方法doinBackground,重写OnPreExecute,重写onProgressUpdate,重写OnPostExecute,并且在启动的地方调用exxecute
对于三种泛型参数分为 Params:启动任务执行的输入参数 Progress:后台任务启动的百分比 Result:后台执行任务最终返回的结果
三.使用AsyncTack做倒计时进度条
首先布局代码如下
<TextView
android:id="@+id/load_tx"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="准备下载"
/>
<Button
android:id="@+id/Down_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击下载"/>
<EditText
android:id="@+id/shuru_ET"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
之后Activity的布局如下
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView textView;
private EditText editText;
private int ti;
private int tt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blid();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new MyAsynTask().execute();//启动MyAsynTask任务
}
}); }
private void blid() {
button=findViewById(R.id.Down_btn);
textView=findViewById(R.id.load_tx);
editText=findViewById(R.id.shuru_ET);
}
class MyAsynTask extends AsyncTask<Integer,Integer,String>{
//执行耗时操作
@Override
protected String doInBackground(Integer... integers) {
int tt = Integer.parseInt(editText.getText().toString());
for (int i = 0;i<tt;i++){
publishProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "下载完成"; }
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
textView.setText(values[0]+"");
}
//耗时操作完成时 执行此方法
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
textView.setText(s);
}
}
}
四.使用AsyncTask做进度条
而后者可以同时进行多个下载任务的执行不用等这个下完在等另外一个但是需要注意的一点就是最多这能够同时进行五个下载任务同时下载多的就要等第一个下载完,然后接着下载
布局文件和前面差不多只不过是添加了
<ProgressBar
android:id="@+id/pd1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
/>
要变成直线型进度条就是style="@style/Widget.AppCompat.ProgressBar.Horizontal" 之后Activity的代码如下
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn1;
private Button btn2;
private ProgressBar ph1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blid();
btn1.setOnClickListener(this);
}
private void blid() {
btn1 = findViewById(R.id.button_btn1);
ph1 = findViewById(R.id.pd1);
ph1.setMax(10);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button_btn1:
new MyAsynTask().execute();
break;
}
}
class MyAsynTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected Integer doInBackground(Integer... integers) {
for (int i = 0; i <= 10; i++) {
try {
Thread.sleep(1000);
publishProgress(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return 1;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
ph1.setProgress(values[0]);
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
btn1.setText("下载完成");
}
}
}
五.Execute()和executeOnExecutor的区别对于区别就是前面的对于多个同时进行的任务只能够一个下载完成之后一个接着一个下载,而后者可以同时进行多个下载任务的执行不用等这个下完在等另外一个但是需要注意的一点就是最多这能够同时进行五个下载任务同时下载多的就要等第一个下载完,然后接着下载
六.对于Handler的使用和AsyncTask
我比较喜欢AsyncTask他只要控制3个参数,几个方法就可以,代码量比较小,结构清晰使用,可以快速的实现异步更新UI,特别是多线程时也可以很好的表现,这个是我们单独使用Handler时不具备的,但是在使用过程中注意内部方法的调用顺序以及调用的时机,而且简单快捷适用于,下载,获取,网络数据这种场景。