AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:
doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:
onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:
Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;
下面我写的一个AsyncTask简单例子:
1 public class MainActivity extends Activity implements View.OnClickListener { 2 3 private static final String TAG = MainActivity.class.getSimpleName(); 4 private Button mButton = null; 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 initView(); 10 } 11 12 public void initView(){ 13 mButton = (Button)findViewById(R.id.button); 14 mButton.setOnClickListener(this); 15 } 16 17 @Override 18 public void onClick(View view) { 19 if (view == mButton){ 20 // 保证AsyncTask在Android 3.0以上版本并行 21 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 22 Log.v(TAG,"BUILD11111"); 23 new NewAsyncTask("AsyncTask#1111"). 24 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); 25 new NewAsyncTask("AsyncTask#2222"). 26 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); 27 new NewAsyncTask("AsyncTask#3333"). 28 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); 29 new NewAsyncTask("AsyncTask#4444"). 30 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); 31 new NewAsyncTask("AsyncTask#5555"). 32 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); 33 Log.v(TAG,"BUILD22222"); 34 } 35 } 36 37 } 38 39 private static class NewAsyncTask extends AsyncTask<String, Integer, String>{ 40 private String mName = "AsyncTask"; 41 public NewAsyncTask(String name){ 42 super(); 43 mName = name; 44 } 45 @Override 46 protected String doInBackground(String... strings) { 47 try{ 48 Log.v(TAG,"doInBackground===="); 49 Thread.sleep(3000); 50 }catch (InterruptedException e){ 51 e.printStackTrace(); 52 } 53 return mName; 54 } 55 56 @Override 57 protected void onPostExecute(String result){ 58 super.onPostExecute(result); 59 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 60 Log.v(TAG, result + "execute finish at" + df.format(new Date())); 61 } 62 } 63 }
运行效果:
最后总结一下:
Asynctask默认支持可并发任务数量是5个,使用AsyncTask,你要做的是继承父类,然后重写doInBackground(Params...),在里面实现后台操作,如果有返回结果的话,重写onPostExecute(Result),然后处理后台程序的结果。
如果需要更新进度的话,在onPreExecute()里实例化进度条(也可以不在这),之后在doInBackground(Params...)里面用publishProgress()发布进度值,然后重写onProgressUpdate(Progress...)接收onPreExecute()发布的结果,并添加更新进度条的代码。