? ? ? ? 在開發(fā)中,一般耗時的操作我們都要放到子線程中去執(zhí)行,而開啟子線程的方式通常有幾下幾種:
一砸捏、直接new一個Thread
? ? ? ? 這種當(dāng)然是最基本的寫法,不必多說隙赁。
二垦藏、AsyncTask方式
AsyncTask內(nèi)部封裝了Thread和Handler。我們主要實(shí)現(xiàn)它的三個方法伞访,
"doInBackground"掂骏、"onPostExecute"兩個方法,其中"doInBackground"方法在子線程中運(yùn)行咐扭,"onPostExecute"方法在主線程中運(yùn)行芭挽。AsyncTask主要應(yīng)用于在子線程中執(zhí)行耗時操作的過程匯中同時在主線程中刷新界面的情況滑废,AsyncTask在聲明的時候需要聲明三個參數(shù)蝗肪,第一個參數(shù)為asyncTask執(zhí)行開始傳入的參數(shù)類型,如果聲明為void蠕趁,則AsyncTask的execute方法不需要傳入任何參數(shù)薛闪,"onPostExecute"方法在"doInBackground"方法執(zhí)行完畢后調(diào)用,后者的返回值為前者方法的入?yún)陈绻?doInBackground"方法執(zhí)行過程中需要刷新界面豁延,則我們需要重寫AsyncTask的"onProgressUpdate"方法,并在"doInBackground"中調(diào)用此方法腊状。
注:1.在安卓1.6之前AsyncTask內(nèi)部是串行執(zhí)行任務(wù)的诱咏,安卓1.6的時候開始采用線程池來處理并行任務(wù),從安卓3.0開始缴挖,為了避免并發(fā)錯誤袋狞,AsyncTask又采用穿行的方式處理任務(wù);
2.我們在需要AsyncTask停止正在執(zhí)行的任務(wù)的時候(譬如退出APP或者Activity)映屋,可以調(diào)用它的"cancel"方法苟鸯,這個方法需要傳遞一個boolean型的參數(shù),用來表示是否需要中斷當(dāng)前正在執(zhí)行的任務(wù)棚点。
三早处、Timer方式
這個需要我們創(chuàng)建一個Timer的實(shí)例用來維護(hù)一個線程,然后創(chuàng)建一個TimerTask的實(shí)例瘫析,將需要運(yùn)行的邏輯代碼放到TimerTask的run方法中砌梆。
優(yōu)點(diǎn):
1.我們可以手動控制異步任務(wù)和異步線程的停止默责;
2.可以控制一個線程執(zhí)行多個異步任務(wù)。
缺點(diǎn):1咸包、Timer內(nèi)部維護(hù)著一個線程傻丝,有一個異步任務(wù)棧來來記錄所有要執(zhí)行的任務(wù),所以多個任務(wù)在Timer中是順序執(zhí)行的诉儒,如果其中一個TimerTask執(zhí)行時間過長葡缰,可能會使得此任務(wù)之后的任務(wù)不能按時執(zhí)行,其中一個任務(wù)沒有捕獲拋出的異常的話忱反,也會使得后面的任務(wù)無法執(zhí)行泛释;
2、Timer執(zhí)行周期任務(wù)時依賴系統(tǒng)時間温算,Timer執(zhí)行周期任務(wù)時依賴系統(tǒng)時間怜校,如果當(dāng)前系統(tǒng)時間發(fā)生變化會出現(xiàn)一些執(zhí)行上的變化。
所以當(dāng)我們使用Timer的時候一定要考慮好應(yīng)用場景注竿。