用这个类主要是因为不要在UI Thread中阻塞进程执行给用户ANR的体验,AsyncTask会在UI Thread之外另创线程执行后台任务,并返回内容给UI Thread。不过它依然不适合使用在需要长时间计算的任务,需要更长时间处理的任务最好使用java.util.concurrent
包中的方法。详细介绍可以参看android的帮助文档AsyncTask。
AsyncTask事实上是一个异步处理方式的帮助类,主要方法有 onPreExecute, doInBackground, onProgressUpdate 和onPostExecute,分别对应1. 在后台处理前进行一些初始化;2. 后台处理;3. 更新进度;4. 处理后的返回。
使用AsyncTask需要先创建它的子类,譬如下面所示一个下载文件任务:
private class DownloadFilesextends AsyncTask<URL, Integer, Long>
事实上,<>的3个参数泛型原型为:Params, Progress, Result,这就很好理解他们三个的作用分别是什么。如果某个参数不需要,则使用Void代替,譬如<URL, Void, Void>则只需要参数URL。
创建了子类,使用AsyncTask就相当简单了,你只需要在UI Thread中敲入这样的代码:
new DownloadFilesTask().execute(url1, url2, url3);
这里需要注意的是,在更新进度时要操作UI界面元素,但对界面控件的处理只能在UI Thread中进行,所以推荐的一个方法是把AsyncTask子类定义在你的Activity类中,譬如“Android中AsyncTask的简单用法”中所示。
最后啰嗦一句,上面说的AsyncTask四个方法不能在UI Thread中手工调用哦,你只需要实例化并execute就ok了。