相当于对handle的封装,可以更方便我们在子线程和主线程中传递数据。
并且因为AsyncTask中采用线程池机制,所以速度比handle快。
AsyncTask写成内部类,我们就可以调用主线程里面的变量,例如后面onProgressUpdate来更新activity就需要主线程里面的变量。
AsyncTask中我们被重写的方法一般三个:onPreExecute、doInBackground、onPostExecute
onPreExecute最先被执行,用来加载对话框什么的,提示用户我们下面要进行耗时操作了。
doInBackground我们在这一部分里面执行耗时的操作,比如说网络访问。
onPostExecute在doInBackground方法后面执行,可以用获取到的网络数据更新activity,result参数就是用来传结果数据的。
比如现在改变需求:
我们要下载一个很大的东西,比如王者荣耀,所以我们要给用户显示我们的下载进度。
这个时候可以在doInBackground中添加publishProgress方法,publishProgress方法会去调用AsyncTask重写的onProgressUpdate方法,
我们可以在onProgressUpdate方法中去更新进度条。
AsyncTask中的progress参数就是做这个用的。
1 package com.example.asynctask; 2 3 import android.app.Activity; 4 import android.os.AsyncTask; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.widget.TextView; 8 9 public class MainActivity extends Activity { 10 private TextView tv_text; 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 tv_text = (TextView) findViewById(R.id.tv_text); 17 18 MyAsyncTask task=new MyAsyncTask(); 19 //执行 20 task.execute("www.baidu.com"); 21 } 22 23 class MyAsyncTask extends AsyncTask<String,Integer, String> { 24 /** 25 * 被主线程执行,在doInBackground函数前执行 26 * */ 27 @Override 28 protected void onPreExecute() { 29 // 弹加载对话框 30 Log.d("bh", "onPreExecute"); 31 } 32 33 /** 34 * 被子线程执行,用来处理耗时行为 35 * */ 36 @Override 37 protected String doInBackground(String... params) { 38 Log.d("bh", "doInBackground:"+params[0]); 39 for(int i=1;i<=100;i++){ 40 try { 41 Thread.sleep(1000); 42 //推送当前的进度 43 publishProgress(i); 44 } catch (InterruptedException e) { 45 e.printStackTrace(); 46 } 47 } 48 return null; 49 } 50 @Override 51 protected void onProgressUpdate(Integer... values) { 52 //更新UI上的进度 53 tv_text.setText(values[0]+""); 54 } 55 /** 56 * 被主线程执行,在doInBackground函数后执行 57 * */ 58 @Override 59 protected void onPostExecute(String result) { 60 Log.d("bh", "onPostExecute"); 61 // 更UI数据 62 tv_text.setText(result); 63 } 64 } 65 }