一、AsnycTask的使用:
1.定义
AsyncTask异步任务类,比Handle更轻量级,更适合简单的异步操作。内部封装了Handle,在使用AsyncTask类进行刷新控件的刷新操作时,不用再额外创建声明Handle,可以直接使AsyncTask内部封装好的几个方法实现。
2.同步和异步的区别
同步:当我们执行某个功能时,在没有得到结果之前,这个调用就不能返回!简单点就是说必须等前一件事做完才能做下一件事;举个低俗的例子:比如你啪啪啪,为了避免弄出人命,肯定要先戴好套套,然后再啪啪啪。套套戴好,然后啪啪啪,比如你没套套,那啪啪啪的操作就要等待了,直到你把套套买回来带上,这个时候就可以开始啪啪啪了。
异步:和同步则是相对的,当我们执行某个功能后,我们并不需要立即得到结果,我们额可以正常地 做其他操作,这个功能可以在完成后通知或者回调来告诉我们;比如下载的时候可以后台下载, 我们执行下载功能后,我们就无需去关心它的下载过程,当下载完毕后通知我们就可以了~
3.三个参数
public abstract class AsyncTask<Params, Progress, Result>
Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数。
Progress:异步任务执行过程中,返回下载进度值的类型。
Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致。
4.主要方法
-
execute(Param)
-
onProgressUpdate(Progress…)
在主线程中显示线程任务的执行进度,doInBackground方法中调用publishProgress方法则触发该方法 -
onPreExecute()
执行线程任务doInBackground之前的操作 -
onPostExecute(Result)
接收线程任务的执行结果,将执行结果显示在界面上 -
Result doInBackground(Param…)
接受输入的参数,执行任务中的耗时操作,返回线程任务的执行结果 -
onCancelled()
取消异步任务时触发该方法
5.使用步骤
- 创建AsyncTask子类&根据需求实现核心方法
- 创建AsyncTask子类的实例对象
- 手动调用execute( )从而执行异步线程任务
5.注意事项
- Task的实例必须在UI Thread中创建;
- execute()方法必须在UI Thread中调用;
- 不要手动的调用onPreExecute()、onPostExecute(Result)、doInBackground(Param…)、onProgressUpdate(Progress…)这几个方法;
- 该Task只能被执行一次,否则多次调用时将会出现异常;
二、代码案例:
模拟进度条加载
/**
* Params: Void
* Progress: Integer
* Result: String
*
* onPreExecute --> doInBackground --> onProgressUpdate --> onPostExecute
*/
class ProgressTask extends AsyncTask<Void, Integer, String> {
//执行线程任务doInBackground之前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
textView.setText("加载中");
}
//接受输入的参数,执行任务中的耗时操作,返回线程任务的执行结果
@Override
protected String doInBackground(Void... voids) {
try {
for (int i = 1; i <= 100; i++) {
publishProgress(i);
Thread.sleep(50);
}
return "加载完毕";
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
//在主线程中显示线程任务的执行进度,
//在doInBackground方法中调用publishProgress方法则触发该方法
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
textView.setText("加载中..." + values[0] + "%");
}
//接收线程任务的执行结果,将执行结果显示在界面上
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s != null) {
textView.setText(s);
}
//异步任务类只能执行一次,当取消或完成时需要重新创建对象
pt = new ProgressTask();
}
//取消异步任务时触发该方法
@Override
protected void onCancelled() {
super.onCancelled();
textView.setText("已取消");
progressBar.setProgress(0);
}
}
TextView textView;
ImageView start, stop;
ProgressBar progressBar;
ProgressTask pt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress);
textView = findViewById(R.id.text);
start = findViewById(R.id.start);
stop = findViewById(R.id.stop);
progressBar = findViewById(R.id.progress_bar);
pt = new ProgressTask();
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (pt.isCancelled()) {
pt = new ProgressTask();
}
pt.execute();
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pt.cancel(true);
}
});
}
参考文章:
https://www.runoob.com/w3cnote/android-tutorial-ansynctask.html