?一、繼承自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():如果在任務結束前被取消則返回真