一、继承自java.lang.Object,包名android.os.AsyncTask<Params,Progress,Result>
二、public abstract class AsyncTask<Params,Progress,Result> extends Object
AsyncTask可以适当和简单的调用UI线程。这个类可以在后台执行,输出结果到UI线程而不用操作线程或者handler类
定义一个异步线程,运行于后台线程且结果输出到UI线程。定义一个异步线程需要三个通用的类型,Params,Progress和Result,四个步骤,beigin ,doInBackground,processProgress 和end.
三、使用Usage
AsyncTask必须通过继承来使用。子类至少要重写一个方法(doInBackground(...)),但是大多数情况下还需要重写第二个方法(onPostExecute(Result))
下面是一个实例子类
private class DownloadFilesTask extends AsyncTask<URL,Interger,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("Download"+result+"bytes");
}
}
一旦创建好,一个线程类执行非常简单;
new DownloadFilesTask().execute(url1,url2,url3);
四、AsyncTask的通用参数
异步线程使用的三个通用参数如下:
1、Params,在执行程序时,发送给线程的参数类型
2、Progress,在后台程序执行期间输出的进度条控件
3、Result,后台程序的输出结果。
不是所有的参数都会被异步线程使用。对于不适用的参数,使用Void。
private class MyTask extends AsyncTask
五、The 4steps 四个步骤
当一个异步线程被执行,程序要经过四个步骤
1、onPreExecute(),在线程执行后立即调用UI线程。这步通常用来创建程序,例如在窗口创建一个进度条。
2、doInBackground(Params...)在方法onPreExecute()执行完后立即在后台线程调用。这步通常用来后台程序的执行,可能需要花费一定的时间。异步线程参数在此时被传递。运算的结果在该步骤被返回,在最后的步骤中被传递回去。该步骤页可以使用publishProgress(Progress...)展示一个或者多个进度条。这些值被出书在UI线程,在onProgressUpdate(Progress..)方法中
3、onProgressUpdate(Porgress...),在publishPorgress(Progress..)被调用后立即在UI线程调用。执行时间没有定义。在后台程序计算的过程中,这个方法可以展示在界面上的任何类型的进度条。例如,可以用来展示进度条动画和在文本框展示日志。
4、onPostExecute(Result),在后台程序执行完后,立即被UI线程调用。后台的计算结果此时作为参数被传递。
六、线程规则Threading rules
为了让你的泪更好的工作你的泪必须遵循下列的线程规则:
.异步线程实例必须在UI线程创建
.execute(Params..)必须在UI线程被调用
.不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params...),onPorgressUpdate(Progress...)
.线程只能被执行一次
七、嵌套类AsyncTask.Status:记录线程的当前数据状态
八、构造方法AsyncTask()
九、方法摘要
cancle(boolean mayInterruptIfRuning):取消该任务的执行
execute(Params...params):指定参数并执行程序
get():等待,如果需要计算完成,然后检索其结果
get(long timeout, TimeUnit unit):最多等待到给定的时间,如果需要计算完成,然后检索其结果。
getStatus():得到当前任务的状态数据
isCancelled():如果在任务结束前被取消则返回真
网友评论