AsyncTask的定义
1、一个Android 已封装好的轻量级异步类
2、 属于抽象类,即使用时需 实现子类
作用
1、实现多线程
在工作线程中执行任务,如 耗时任务
2、异步通信、消息传递
实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作
优点
- 方便实现异步通信
不需使用 “任务线程(如继承Thread类) + Handler”的复杂组合 - 节省资源(轻量级)
采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销
常用方法和方法的执行顺序
进度条例子
布局
<ProgressBar
android:layout_marginTop="30dp"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progressBar"/>
<TextView
android:id="@+id/tv_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" 0 / 100"/>
<Button
android:layout_marginLeft="100dp"
android:text="start"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/b9"/>
MyAsyncTack类
package com.test;
import android.os.AsyncTask;
import android.os.Handler;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
* AsyncTack泛型的三个参数
* 1. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数
* 2. Progress:异步任务执行过程中,返回下载进度值的类型
* 3. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
*注:
* 1. 使用时并不是所有类型都被使用
* 2. 若无被使用,可用java.lang.Void类型代替
* 3. 若有不同业务,需额外再写1个AsyncTask的子类
*/
public class MyAsyncTask extends AsyncTask<Integer,Integer,String> {
private TextView textView;
private ProgressBar progressBar;
public MyAsyncTask(TextView textView,ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar;
}
//最先执行的方法
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
textView.setText("加载完成!");
}
/**
* 在doInBackground方法中每次调用publishProgress方法都会触发此方法
* 此方法运行在ui线程中,可操作ui控件
* @param values
*/
@Override
protected void onProgressUpdate(final Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
//setText的参数是string,不然报错
textView.setText("loading..."+values[0]+"%");
}
//后台执行的方法
@Override
protected String doInBackground(Integer... integers) {
int i=0;
for (i = 10; i <=100 ; i+=10) {
try{
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
return i+integers[0].intValue()+"";
}
}
MainActivity类
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ProgressBar progressBar;
private TextView tv;
private Button b9;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b9 = findViewById(R.id.b9);
progressBar = findViewById(R.id.progressBar);
tv = findViewById(R.id.tv_num);
b9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyAsyncTask myAsyncTask = new MyAsyncTask(tv,progressBar);
myAsyncTask.execute(100);
}
});
}
}