简单使用
直接使用匿名内部类即可:
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
//这里做网络操作或者耗时操作即可
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
//这里处理网络操作结果,或者更新ui
}
}.execute();
如果你仅仅要会用,以上便已足够用在很多情况了!
下面我们来详细了解下这个东东。
详细解释
new AsyncTask<Params, Progress, Result>{
protected void onPreExecute(){}
protected Result doInBackground(Params... params){}
protected void onProgressUpdate(Progress... values){}
protected void onPostExecute(Result result){}
protected void onCancelled() {}
}.execute();
方法解释:
- onPreExecute(): 首先执行,与主线程在同一线程,可以先对ui进行一些预处理,该方法可以不实现
- doInBackground() : 将在onPreExecute 方法执行后马上执行,后台任务执行的线程,不与主线程在同一线程内,该方法必须实现
- onProgressUpdate():可以进行进度条的更新,或者更新ui也可以,此方法和主线程在同一线程内,在doInBackground方法中调用publishProgress(progress)方法即会执行该方法,方便在任务执行过程中了解任务的进度,同时在界面上显示任务的进度情况,该方法不一定需要实现
- onPostExecute(): 任务执行完成后执行,处理doInBackground返回的结果,和主线程在同一线程内。该方法不一定需要实现。
- onCancelled() : 在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用,该方法不一定需要实现。(该方法不一定能成功)
参数解释:
AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params : 启动任务执行的输入参数,比如HTTP请求的URL。 可以在.execute()方法中传入参数。
Progress : 任务执行过程中可用来传递消息的参数,方便了解任务的执行情况。例如可以用来更新进度条之类的。
Result : 后台执行任务最终返回的结果,比如String。
注意事项:
1、 AsyncTask 的最大上限数量
在Android 3.0之前,在AsyncTask中对线程池总大小有限制,同一时刻能够运行的线程数做了规定,代码如下所示:
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final int KEEP_ALIVE = 10;
……
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
可以看到,这里规定同一时刻能够运行的线程数为5个,线程池总大小为128。也就是说当我们启动了10个任务时,只有5个任务能够立刻执行,另外的5个任务则需要等待,当有一个任务执行完毕后,第6个任务才会启动,以此类推。而线程池中最大能存放的线程数是128个,当我们尝试去添加第129个任务时,程序就会崩溃。当然在3.0之后有了很大改变,我们下篇源码解析再说;
2、 .execute(Params… params);
方法可以有带参数的方法,以该方法执行,则doInBackground接收的参数即是该参数
以上方法中的参数都是数组,比如doInBackground(Params... params)方法中,取得参数一般是用params[0]取得传入的参数,params[n]即取得第n个参数
3、 为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常