AsyncTask的基本结构:
AsyncTask是一个抽象类,一般我们都会定义一个类继承AsyncTask然后重写相关方法(以下说明图是借用于coder_pig大神的,总结的很好,和大家一起分享)
以下3个参数分别是:(可以是多种类型数据,比如,int,String,List集合,Bitmap位图等等)
Params:启动任务时的输入参数类型,myAsyncTask.excute(参数)。
progress:后台执行任务进度的传入参数类型。
Result:任务执行完成后返回的结果的数据类型,即onPostExecute(参数)这里的参数类型。
- 构建AsyncTask子类的参数:
- 相关方法与执行流程:
- 注意事项:
实例效果:
MyAsyncTask.java的代码如下:
package com.deepreality.asynctaskdemo;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MyAsyncTask extends AsyncTask<Integer,Integer,String> {
private TextView tvTitle;
private ProgressBar pbarDownLoad;
public MyAsyncTask(TextView tvTitle, ProgressBar pbarDownLoad) {
this.tvTitle = tvTitle;
this.pbarDownLoad = pbarDownLoad;
}
//该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法
//触发onProgressUpdate对UI进行操作
@Override
protected String doInBackground(Integer... integers) {
DelayOperator delayOperator = new DelayOperator();
int i = 0;
for (i = 10; i <= 100; i += 10) {
delayOperator.delay(1000);
publishProgress(i);
}
return String.valueOf(i + integers[0].intValue());
}
//该方法运行在UI线程中,可对UI控件进行设置(在执行之前)
@Override
protected void onPreExecute() {
tvTitle.setText("开始执行异步任务!");
}
//在doBackground方法中,每次调用publishProgress方法都会触发该方法
//运行在UI线程中,可对UI控件进行操作
@Override
protected void onProgressUpdate(Integer... values) {
int value = values[0];
pbarDownLoad.setProgress(value);
}
}
DelayOperator.java的代码如下:(这是一个延时方法)
package com.deepreality.asynctaskdemo;
public class DelayOperator {
public void delay(int time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MainActivity.java的代码如下:
package com.deepreality.asynctaskdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tvTitle;
private ProgressBar progressBar;
private Button btnUpdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
componentInit();
componentAddClickListener();
}
private void componentInit() {
tvTitle = findViewById(R.id.main_tvTitle);
progressBar = findViewById(R.id.main_pbar);
btnUpdate = findViewById(R.id.main_btnUpdate);
}
private void componentAddClickListener() {
btnUpdate.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_btnUpdate:{
MyAsyncTask myAsyncTask = new MyAsyncTask(tvTitle, progressBar);
myAsyncTask.execute(1000);
break;
}
default:break;
}
}
}