AsyncTask类使得UI线程的使用更加方便和容易。它可以后台运行操作并且将结果
显示在UI线程上,而不需要去操作线程或者是handlers。
一个很好的例子比如进度条显示。
下面来看下用法。
AsyncTask是抽象类,所以必须继承使用。使用时需要至少实现一个方法,通常
被实现的是onPostExecute(Result result)
下面是一个例子
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { 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; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTask类属于泛型,他有三个泛型类型
AsyncTask<Params, Progress, Result>
Params
, 执行任务时需要的参数的类型。
Progress
, 后台处理过程中,前台显示的所需处理进度的类型
Result
, 后台处理的结果的类型
不是所有的类型需要指定,不需要的话,可以指定为void,如
private class MyTask extends AsyncTask<Void, Void, Void> { ... }当AsyncTask执行时,一共会有4个步骤
onPreExecute(),由UI线程在任务开始执行后立即调用,这一步通常用来初始化任务,
例如显示一个进度条。
doInBackground(Params...),由后台线程在onPreExecute()方法执行结束后立即执行,
这一步通常用来处理花费时间的后台计算工作,运算结果需在这一步返回,在这一步也
可以使用publishProgress(Progress...)来显示处理过程的进度单元,
这些情况会
在onProgressUpdate(Progress...)这一步在UI线程上显示
onProgressUpdate(Progress...),该方法在
publishProgress(Progress...)之后被调用,
执行时间不确定,该方法以某种形式向用户显示处理过程当后台在进行运算时。比如
可以显示一个处理进度条。
onPostExecute(Result),当后台运算结束后,被调用,处理结果作为参数传递给该方法。