前言
相较于Handler,AsyncTask更简单一点,它是一个抽象类,要实现异步消息,就的自己创建一个类继承AsyncTask,重写要使用的方法,将要在子线程中执行的程序,放在doInBackground方法中,要在更新界面时,子线程中返回的结果在onPostExecute()方法中,怎么显示就任由开发者了,当然还会有其它几个方法,下面会一一解释。
AsyncTask的泛型参数
在新建一个AsyncTask时,需要指定三个泛型参数:Params、Progress、Result。
- Params是指执行任务时所需要的参数;
- Progress是指执行任务时的进度;
- Result是任务执行完毕之后,返回的参数。
AsyncTask的几个方法
要执行任务时,我们只需在合时宜的方法中,执行自己想要执行的程序即可。它们分别是:
- onPreExecute 该方法在任务执行前调用,可以在该方法中做一些UI界面的初始化操作,比如来个弹窗之类的。
- doInBackground 在该方法中就执行自己的耗时任务,它是运行在子线程中,当任务运行完毕之后,即可将结果return,AsyncTask会自己将该结果传递到onPostExecute()中,当然如果想实时显示任务进度,则可以在该方法中调用publishProgress()方法,调用该方法之后,AsyncTask会将它穿的参数传递到onProgressUpdate()中。
- onProgressUpdate方法主要是更新任务进度的,它是执行在UI线程中,可以修改界面。
- onPostExecute()方法是用来处理任务结果的,它的参数即任务结束之后return过来的参数,该方法是执行在UI线程中,可以修改界面。
第一行代码Demo参考
package com.example.myasynctask;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ProgressDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
Button mBtnDownload = findViewById(R.id.btn_download);
mBtnDownload.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new DownloadAsyncTask().execute("开始");
}
class DownloadAsyncTask extends AsyncTask<String,Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
initDialog();
}
@Override
protected String doInBackground(String... strings) {
int i = 0;
while (true){
i++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
if(i>=100){
break;
}
}
return "下载完成";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(String bitmap) {
super.onPostExecute(bitmap);
Toast.makeText(MainActivity.this,bitmap,Toast.LENGTH_SHORT).show();
mDialog.dismiss();
}
}
private void initDialog() {
mDialog = new ProgressDialog(this);
mDialog.setMax(100);
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setTitle("下载进度");
mDialog.show();
}
}