0、目录
一、介绍
二、类和方法介绍
2.1、类定义
2.2、核心方法
三、使用步骤
四、使用实例
五、AsyncTask存在的问题和缺陷
一、介绍
二、类和方法介绍
2.1、类定义
public abstract class AsyncTask<Params, Progress, Result> {
......
}
1、首先AsyncTask是抽象类,所以不可直接实例化,必须实现子类。
2、 AsyncTask<Params, Progress, Result>使用泛型,主要作用是在执行任务控制输入或返回的数据类型。
Params:决定了执行excute()方法时传入的参数类型,excute()方法传入的参数会传入到方法doInBackground(),所以同时也决定了doInBackground()方法内的参数类型。
Progress:任务执行时,返回进度值的类型,即onProgressUpdate()方法内的参数类型。
Result:任务完成后,返回的结果的类型,即doInBackground()方法的返回类型,doInBackground()方法的返回结果传入onPostExecute()方法作为参数,所以同时也决定了onPostExecute()方法的参数类型。
注:Params, Progress, Result并不应都要使用,如果没有使用,可以用java.lang.Void代替。
2.2、核心方法
切记自己不能手动调用onPreExecute(), doInBackground(), onProgressUpdate(),onPostExecute(),onCancelled()等方法,这些方法都是系统自动调用的。
三、使用步骤
AsyncTask的使用步骤有三个:
步骤1、创建AsyncTask的子类,并根据需要复写相关的方法
步骤2、创建AsyncTask的子类实例对象
步骤3、调用子类实例对象的execute()方法,执行异步任务
具体如下:
//步骤1、创建AsyncTask的子类,并根据需要复写相关的方法
//继承AsyncTask,并确定泛型类型
class mAsyncTask extends AsyncTask<String, Integer, String> {
//UI线程执行
//任务执行前的准备工作
@Override
protected void onPreExecute() {
}
//必须复写,因其在AsyncTask内是抽象函数
//异步任务真正执行的位置
@Override
protected String doInBackground(String... strings) {
//子线程中执行
//可调用publidshProgress(Integer)方法触发onProgressUpdate()方法执行,更新进度
return null;
}
//UI线程执行
//更新线程任务进度
@Override
protected void onProgressUpdate(Integer... values) {
}
//UI线程执行
//异步任务执行完成后的一些操作
@Override
protected void onPostExecute(String s) {
}
//UI线程执行
//异步任务被取消时调用
@Override
protected void onCancelled(String s) {
}
}
//步骤2、创建AsyncTask的子类实例对象
//UI线程中执行
mAsyncTask task = new mAsyncTask();
//步骤3、调用子类实例对象的execute()方法,执行异步任务
//UI线程中手动调用execute(Params... params)方法,系统会自动调用步骤一中的各种方法
//同一个实例对象只能执行一次,否则会抛出异常
task.execute();
四、使用实例
实例说明:点击开始,开始执行异步线程任务,并进度条显示进度,点击取消,则取消任务。
布局文件:activity_main.xml
<?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=".MainActivity"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<Button
android:id="@+id/mBtnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始"/>
<Button
android:id="@+id/mBtnQuit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/mProgressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="20dp"/>
<TextView
android:id="@+id/mTxtProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"/>
</LinearLayout>
</LinearLayout>
主要代码:
public class MainActivity extends AppCompatActivity {
private TextView mTxtProgress;
private Button mBtnStart, mBtnQuit;
private ProgressBar mProgressBar;
private mAsyncTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intiView();
mBtnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//步骤2、创建AsyncTask的子类实例对象
task = new mAsyncTask();
//步骤3、调用子类实例对象的execute()方法,执行异步任务
task.execute("1");
}
});
mBtnQuit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击取消,并没有真正停止异步任务,异步任务仍然在正常运行
task.cancel(true);
}
});
}
private void intiView() {
mTxtProgress = (TextView) findViewById(R.id.mTxtProgress);
mBtnStart = (Button) findViewById(R.id.mBtnStart);
mBtnQuit = (Button) findViewById(R.id.mBtnQuit);
mProgressBar = (ProgressBar) findViewById(R.id.mProgressBar);
}
private void ToastShow(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
/*
* AsyncTask<String, Integer, String> 中的泛型类型含义:
* String:是task.execute("1");中传入的参数类型
* Integer:是onProgressUpdate(Integer... values)中的参数类型
* String:是doInBackground()的返回值类型,是onPostExecute(String s)的参数类型
* */
//步骤1、创建AsyncTask的子类,并根据需要复写相关的方法
class mAsyncTask extends AsyncTask<String, Integer, String> {
int count = 0;
//UI线程执行
@Override
protected void onPreExecute() {
ToastShow("onPreExecute");
}
//必须复写,因其在AsyncTask内是抽象函数
//子线程执行
//strings:是task.execute("1");中传入的参数
@Override
protected String doInBackground(String... strings) {
//子线程中执行
int size = strings.length;
while (count < 100) {
try {
Thread.sleep(30);
} catch (Exception e) {
e.getMessage();
}
count++;
System.out.println(Thread.currentThread().getName() + ":" + strings[0] );
publishProgress(count);//此处传递数据给onProgressUpdate()
}
return null;
}
//UI线程执行
@Override
protected void onProgressUpdate(Integer... values) {
mProgressBar.setProgress(values[0]);
mTxtProgress.setText(values[0] + "%");
}
//UI线程执行
@Override
protected void onPostExecute(String s) {
ToastShow("完成");
}
//UI线程执行
@Override
protected void onCancelled(String s) {
ToastShow("onCancelled(String s) + " + s);
mProgressBar.setProgress(0);
mTxtProgress.setText("0%");
}
}
}
五、AsyncTask存在的问题和缺陷
详见另一篇文章:AsyncTask存在的问题和缺陷