声明:本文是shunWang原创文章,转载请注明出处:  http://shunji.wang/2017/02/26/asynctask/

要知道怎么使用AsyncTask首先得知道何为AsyncTask以及AsyncTask的作用,AsyncTask译成中文就是异步任务,在其内部封装了Handler机制,主要用来实现子钱程与UI线程的协同工作,比如子线程通知UI线程更新界面,所以AsyncTask的实质就是Google给我们封装好的Handler机制。

第一步:继承

AsyncTask是泛型抽象类,在使用前需要先创建一个类继承该抽象类,并实现其抽象方法。

public abstract class AsyncTask<Params, Progress, Result>
     参数说明:
     Params:启动AsyncTask时传入的数据类型(可为Void);
     Progerss:表示进度的数据类型(可为Void);
     Result:任务执行完毕后返回的数据类型(可为Void);


第二步:实现抽象方法doInBackground;
     @Override
    protected Object doInBackground(Object[] objects) {
    return null;
      }


第三步:重写三个方法,这四个方法的作用后面一点说,先说步骤;
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(Object[] values) {
    super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(Object o) {
    super.onPostExecute(o);
}

这四个方法的运行顺序见下图:


方法说明:
onPreExecute():在异步任务执行前被调用,做准备工作;
doInBackground():执行后台任务,返回结果由onProgressUpdate()接收(注意此方法是在子线程中运行);
onProgressUpdate():后台任务执行过程中调用publishProgress()方法更新任务进度时被调用;
onPostExecute():当后台任务执行完之后被调用,用于返回结果;


第四步:调用AsyncTask的实例方法execute()执行一个异步任务


任务的终止:
@Override
protected void onCancelled() {
    super.onCancelled();
}
废话就只说这么多了,最后上完整的代码供大家参考:

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }

 public void myClick(View view) {

 //创建异步任务并执行,参数传递给后台任务doInBackground
 new MyAsync().execute(1,2,3,4,5,6);
    }

 class MyAsync extends AsyncTask<Integer,Integer,Bitmap>{

 private ImageView imageView;
 private ProgressDialog dialog;

 //在异步任务执行之前被调用,做准备工作。(被UI线程调用)
 @Override
 protected void onPreExecute() {
 super.onPreExecute();
 Log.d("FSLog","onPreExecute");

 imageView = (ImageView) findViewById(R.id.imageView);

 dialog = new ProgressDialog(MainActivity.this);
 dialog.setMax(100);
 dialog.setTitle("正在下载。。。");
 dialog.show();
     }

 //执行后台任务 (后台线程调用)
 @Override
 protected Bitmap doInBackground(Integer... params) {

 Log.d("FSLog","doInBackground" + params[2]);

 //publishProgress(100);这里调用这个方法就会触发onProgressUpdate()

 HttpURLConnection conn = null;
 InputStream fis = null;
 Bitmap bitmap = null;
 try {
 URL url = new URL("http://192.168.1.104:8080/HttpUrlConnectionServer/TomCat.jpg");

 conn = (HttpURLConnection) url.openConnection();

 conn.setRequestMethod("GET");
 conn.setReadTimeout(3000);
 conn.setConnectTimeout(3000);
 conn.setDoOutput(false);
 conn.setDoInput(true);
 conn.setUseCaches(true);
 conn.connect();

 if(!(conn.getResponseCode() == HttpURLConnection.HTTP_OK))
   {
 return null;
        }

 fis = conn.getInputStream();

 bitmap = BitmapFactory.decodeStream(fis);

 } catch (Exception e) {
 e.printStackTrace();

 if(fis != null)
 {
 try {
 fis.close();
 } catch (IOException e1) {
 e1.printStackTrace();
    }
 }
 if(conn != null) {
 conn.disconnect();
    }
 }
 return bitmap;
 }

 //当后台任务执行完之后被调用,用于返回结果 更新UI (被UI线程调用)
 @Override
 protected void onPostExecute(Bitmap bitmap) {
 super.onPostExecute(bitmap);
 Log.d("FSLog","onPostExecute");

 imageView.setImageBitmap(bitmap);

 dialog.dismiss();
 }

 //后台任务执行过程中调用publishProgress()方法更新任务的进度时,被调用 (被UI线程调用)
 @Override
 protected void onProgressUpdate(Integer... values) {
 super.onProgressUpdate(values);
 Log.d("FSLog","onProgressUpdate" + values[0]);
     }
   }
}