AsyncTask 异步任务使用
1、AsyncTask 简单说明
1).AsyncTask < Integer,Integer,String> 参数说明
参数一:需要被执行的输入参数,与 AsyncTask 重写的 doInBackground()方法有关系
参数二:这个参数表示后台任务完成的类型,与onProgressUpdate()方法有关
参数三:后台任务完成后,返回结果的类型,与onProgressUpdate()和onPostExecute()有关
@Override
protected String doInBackground(Integer... integers) {
@Override
protected void onProgressUpdate(Integer... values){
1、onProgressUpdate()
@Override
protected String doInBackground(Integer... integers) {
while (myDownload++ != 6){
try{
Thread.sleep(1000);
publishProgress(myDownload);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "finish";
}
2、onPostExecute()
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("test",s);
2).AsyncTask 方法说明(可以按顺序分 4 步)
1、起手式:onPreExecute(),用于AsyncTask 的准备工作
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("执行任务");
progressDialog.setMessage("任务正在进行,请稍候...");
progressDialog.setCancelable(false);
progressDialog.setMax(5);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.show();
}
2、平剑式:onProgressUpdate(Integer… values) ,关于参数在上已述。如果想要得到 String 表示完成类型,将 Integer 以及开始类继承的参数全改为 String 。在这里是返回一个 int 值表示进度完成情况。
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
3、荡剑式:个人感觉 doInBackground(Integer… integers) 很像 handler ,负责处理耗时操作。所以这个方法是必须重写的。
@Override
protected String doInBackground(Integer... integers) {
while (myDownload++ != 6){
try{
Thread.sleep(1000);
publishProgress(myDownload);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "finish";
}
说明:在这个方法中,除了执行耗时操作,还要执行publishProgress(myDownload)这个方法,传递的参数根据自己的情况会不同。通过这个方法,将 myDownload 这个参数传入到 onProgressUpdate()方法中,用于执行更新操作。
4、回剑式:就是结束线程用的方法,当执行完荡剑式后,onPostExecute()方法就会在最后执行,收拾残局。想接收什么类型的参数都可以自己定义形参,doInBackground()会配合的。
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("test",s);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressDialog.dismiss();
}
3).使用
在主进程中,实例化一个对象,然后通过 execute() 方法执行。每个 AsyncTask 只能执行一次,多次调用会出现异常。
new MyAsyncTask(this).execute();
2、代码案例(供参考)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handle_demo);
ButterKnife.bind(this);
new MyAsyncTask(this).execute();
}
//AsyncTask内部类部分
class MyAsyncTask extends AsyncTask<Integer,Integer,String>{
ProgressDialog progressDialog;
Context context;
int myDownload = 0;
public MyAsyncTask(Context ctx){
this.context = ctx;
}
@Override
protected String doInBackground(Integer... integers) {
while (myDownload++ != 6){
try{
Thread.sleep(1000);
publishProgress(myDownload);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "finish";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.d("test",s);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressDialog.dismiss();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("执行任务");
progressDialog.setMessage("任务正在进行,请稍候...");
progressDialog.setCancelable(false);
progressDialog.setMax(5);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.show();
}
}
3、感想:AsyncTask 的三个参数好像不是必须的。
这三个参数,可以根据需要做出变更,简单来说就是如果不需要某些过程,那么这个参数的作用也就可有可无。,又或者直接定义为null,不做操作。自己梳理后凭感觉吧。
欢迎留言评论,一起学习,共同进步。