- AsyncTask是什么
- AsyncTask怎么用
- 需要实现的几个方法分别是什么
- 什么是泛型参数
- 什么是长度可变参数列表
- 案例解析——倒计时Demo
什么是AsyncTask
1.AsyncTask是Android提供的轻量级(实现代码量少)的异步类
2.为了降低异步通信的开发难度,提供了AsyncTask。
3.AsyncTask直接继承Object类,位于android.os包中。
4.使用AsyncTask可以忽略Looper、MessageQueue、Handler等复杂对象,更便捷的完成异步耗时的操作。
AsyncTask怎么用
1.新建内部类继承AsyncTask;
2.定义AsyncTask的三种泛型参数;
3.重写DoInBackground抽象方法;
4.重写onPreExecute方法;
5.重写onProgressUpdate方法;
6.重写onPostExecute方法;
7.需要调用的地方启用execute方法
AsyncTask的泛型参数和常用方法
AsyncTask三种泛型参数
Params:启动任务执行的输入参数
Progress:后台任务执行的百分比
Result:后台执行任务最终返回的结果
onPreExecute方法
1.异步任务开始执行时,系统最先调用此方法。
2.此方法运行在主线程中,可以对控件进行初始化等操作。
doInBackground方法
1.执行完onPreExecute方法后,系统执行此方法。
2.此方法运行在子线程中,比较耗时的操作放在此方法中执行。
onProgressUpdate方法
1.显示当前进度,适用于下载或扫描这类需要实时显示进度的需求。
2.此方法运行在主线程中,可以修改控件状态,例如:显示百分比。
3.触发此方法,需要在doInBackground中使用publishProgress方法。
onPostExecute方法
1.在异步任务执行完成后,系统会调用此方法。
2.此方法运行在主线程中,可以修改控件状态,例如:下载完成。
什么是长度可变参数列表
private void removeTempFiles(String... fileNames) {
for (String fileName : fileNames) {
try {
new File(fileName).delete();
} catch (Exception e) {
}
}
}
String后面的三个点就是代表可变参数,调用的时候可以随便写参数个数,适合不指定性参数
倒计时代码
ackage com.example.myapplication;
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 DownloadTaskActivity extends AppCompatActivity {
private TextView task_tv;
private Button task_btn;
private int count=10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_task);
task_tv = findViewById(R.id.task_tv);
task_btn = findViewById(R.id.task_btn);
task_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DownloadTask().execute();
}
});
}
class DownloadTask extends AsyncTask<String, String, String> {
//启动前
@Override
protected void onPreExecute() {
super.onPreExecute();
task_tv.setText("正在下载");
}
//这个方法一定要重写
@Override
protected String doInBackground(String... strings) {
while (count>0){
publishProgress(count+"");
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "下载完成";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
task_tv.setText(values[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
task_tv.setText(s);
}
}
按下两个按钮,两个进度条同时加载,也就是两个线程同时进行代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ProgressActivity">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="200dp"
style="?android:progressBarStyleHorizontal"
android:id="@+id/progress1"
android:max="100"/>
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/start_button1"
android:text="开始下载1"/>
<ProgressBar
android:layout_width="match_parent"
android:layout_height="200dp"
style="?android:progressBarStyleHorizontal"
android:id="@+id/progress2"
android:max="100"/>
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/start_button2"
android:text="开始下载2"/>
</LinearLayout>
package com.example.a17708.myapplication;
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.ProgressBar;
public class ProgressActivity extends AppCompatActivity implements View.OnClickListener{
private Button start_button1,start_button2;
private ProgressBar progressBar1, progressBar2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress);
start_button1=findViewById(R.id.start_button1);
start_button2=findViewById(R.id.start_button2);
progressBar1=findViewById(R.id.progress1);
progressBar2=findViewById(R.id.progress2);
start_button1.setOnClickListener(this);
start_button2.setOnClickListener(this);
}
class DownProgrss extends AsyncTask<Integer, Integer, Integer> {
private int len = 0;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Integer... index) {
while (len <= 100) {
publishProgress(len, index[0]);
len += 5;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
len = 0;
return index[0];
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
switch (values[1]) {
case 1:
progressBar1.setProgress(values[0]);
break;
case 2:
progressBar2.setProgress(values[0]);
break;
default:
break;
}
}
@Override
protected void onPostExecute(Integer s) {
super.onPostExecute(s);
switch (s) {
case 1:
start_button1.setText("下载完成");
start_button1.setEnabled(true);
break;
case 2:
start_button2.setText("下载完成");
start_button2.setEnabled(true);
break;
default:
break;
}
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.start_button1:
new DownProgrss().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 1);
start_button1.setEnabled(false);
break;
case R.id.start_button2:
new DownProgrss().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 2);
start_button2.setEnabled(false);
break;
default:
break;
}
}
}