今天作者学习了安卓的异步任务,异步任务听起来是个好高大上的东西,其实并没有好高大上。
异步任务到底是什么东西呢?广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步
而言,异步任务就是可以先完成第一步,开启一个线程完成第二步,而不需要等待第二步的完成就可
以去做第三步的事情。而同步任务就是要按顺序的完成任务,先完成第一步,在完成第二步,才能开始
第三步的事情。在安卓中异步任务值得就是AsyncTask这个类。这个类其实就是对Thread+Handler的封装
我们使用这个类就可以很简单地完成异步任务,像填空一样而不需要自己来设计流程。而且AsyncTask封装
了线程池,这样比直接使用Thread更有效率。
说了这么多,那下面我们就来讲讲AsyncTask的使用吧。
AsyncTask的使用很简单,首先创建AsyncTask对象,然后调用它的execute(Params)方法就可以了。下面贴上代码再一步一步分析。
new AsyncTask<String, Integer, String>(){ protected void onPreExecute() { System.out.println("onPreExecute"); }; @Override protected String doInBackground(String... params) { System.out.println("doInBackground......."+params[0]); publishProgress(1); return "这是返回的结果集"; }; protected void onPostExecute(String result) { System.out.println("onPostExecute....."+result); }; protected void onProgressUpdate(Integer[] values) { System.out.println("onProgressUpdate......"+values[0]); }; }.execute("这是参数");
从上面代码中我们可以看到创建AsyncTask对象需要传入三个泛型。
AsyncTask<Params, Progress, Result>
Params 启动任务执行的输入参数,比如HTTP请求的URL。
第一个泛型用来限制execute(Params)和doInBackground(Params)方法传入参数的类型,在execute方法中传入的参数会在doInBackground回调方法中被使用。
Progress 后台任务执行的百分比。
第二个泛型用来限制onProgressUpdate(Progress)和publishProgress(Progress)方法传入参数的类型,在publishProgress方法中传入的参数会在onProgressUpdate回调方法中被使用。
Result 后台执行任务最终返回的结果,比如String。
第三个泛型是用来限制Result doInBackground的返回值和onPostExecute(Result)方法传入参数的类型,在doInBackground中返回的结果会在onPostExecute回调方法中被使用
下面就是执行结果:
08-06 12:28:33.680: I/System.out(1367): onPreExecute 08-06 12:28:33.710: I/System.out(1367): doInBackground.......这是参数 08-06 12:28:33.720: I/System.out(1367): onProgressUpdate......1 08-06 12:28:33.720: I/System.out(1367): onPostExecute.....这是返回的结果集
下面贴上AsyncTask类各个方法的作用和用法:
execute(Params... params) 启动任务, 开始任务的执行流程
void onPreExecute() 在分线程工作开始之前在UIThread中执行,一般用来显示提示视图
Result doInBackground(Params... params) 在workerThread中执行, 完成任务的主要工作,通常需要较长的时间
void onPostExecute(Result result) 在doInBackground()执行完后在UIThread中执行,一般用来更新界面
publishProgress(Progress... values) : 在分线程中, 发布当前进度
void onProgressUpdate(Progress... values) : 在主线程中更新进度
开启异步任务,当然也能取消异步任务,取消异步任务的方法如下:
调用cancle(boolean)方法取消还在执行的异步任务,调用该方法后将会回调isCancelled()方法返回true。
在调用该方法后,onCancelled(Object)代替了onPostExecute(Object)在执行完doInBackground(Object[])后回调。为了保证当前任务尽快被取消,你应该经常检查isCancelled()返回值情况....
异步任务大致的流程如下: