用法
<疯狂android讲义3> 3.6
AsyncTask是一个Android SDK中轻量级的异步任务类,它在线程池中执行后台任务,把执行进度和执行结果返回给主线程,并在主线程更新UI,AsyncTask实质上是对Thread和Handler的封装,通过AsyncTask能够更方便地在执行后台任务的过程中和结束后实现更新UI操作。
AsyncTask是一个抽象类,它需要被实现后才能正常使用,子类必须要复写doInBackground方法,如果需要在执行完后台任务后更新UI,则需要实现onPostExecute方法,下面是一个AsyncTask使用实例:
classDownloadFilesTask extends AsyncTask<URL,Integer,Long>{
@Override
protectedVoid doInBackground(Integer... params){
int count = urls.length;
long totalSize =0;
for(int i =0; i < count; i++){
totalSize +=Downloader.downloadFile(urls[i]);
publishProgress((int)((i /(float) count)*100));
}
return totalSize;
}
protectedvoid onProgressUpdate(Integer... progress){
setProgressPercent(progress[0]);
}
protectedvoid onPostExecute(Long result){
showDialog("Downloaded "+ result +" bytes");
}
}
// 调用方式如下
newDownloadFilesTask().excute(url1, url2, url3);
- Params:执行AsyncTask时传递的参数类型;
- Progress:执行后台任务时更新进度的进度值类型;
- Result:后台任务执行完成后的返回值类型。
注意:并不是所有的参数都需要指明类型,如果某一个参数你没有用到,改成Void类型即可。
执行流程
- onPreExecute:UI线程中调用,在调用excute方法后会立即被调用,这个方法适用于初始化task,比如显示后台任务进度条; doInBackground:非UI线程中调用,在onPreExecute执行后调用,这个方法适用于执行耗时的操作,excute方法中的Params参数就是通过这个方法传递的,该方法的返回值就是Task执行的结果,在doInBackground方法执行过程中,可以通过publishProgress方法来更新后台任务的执行进度;
- onProgressUpdate:UI线程中调用,在publishProgress方法后被调用,这个方法用于在后台任务执行过程中显示任务的进度UI,比如它可以用于显示进度条动画或者显示进度文本;
- onPostExecute:UI线程中调用,后台任务执行完成后被调用,Task返回的结果以参数的形式传递到该方法中。
取消Task
AsyncTask可以在任何时候通过cancel(boolean)方法取消,调用这个方法后,isCancelled()方法的返回值会为true,当执行这个cancle方法后,doInBackground方法执行完成后不会调用onPostExecute方法而是执行onCancelled回调。
注意在使用AsyncTask的过程中必须要遵守如下原则:
- AsyncTask必须在UI线程中实例化;
- excute方法必须要在UI线程中调用;
- 不要人为地调用AsyncTask的回调方法:onPreExecute、onPostExecute、doInBackground和onProgressUpdate;
- 一个AsyncTask实例只能执行一次,如果调用多次,将会报异常。