asynctask介紹
android的asynctask比handler更輕量級一些,適用於簡單的非同步處理。首先明確android之所以有handler和asynctask,都是為了不阻塞主線程(ui執行緒),且ui的更新只能在主線程中完成,因此非同步處理是不可避免的。android為了降低這個開發難度,提供了asynctask。asynctask就是乙個封裝過的後台任務類,顧名思義就是非同步任務。asynctask直接繼承於object類,位置為android.os.asynctask。要使用asynctask工作我們要提供三個泛型引數,並過載幾個方法(至少過載乙個)。
asynctask定義了三種泛型型別 params,progress和result。
params 啟動任務執行的輸入引數,比如http請求的url。
progress 後台任務執行的百分比。
result 後台執行任務最終返回的結果,比如string。
public class myasynctask extends asynctask
根據我們的需要重寫以下方法:
(1)doinbackground(params…) 後台執行,比較耗時的操作都可以放在這裡。注意這裡不能直接操作ui。此方法在後台執行緒執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以呼叫publicprogress(progress…)來更新任務的進度。(此方法必須重寫)
(2)onpostexecute(result) 相當於handler 處理ui的方式,方法引數就是在doinbackground 得到的處理結果,此方法在主線程執行可以操作ui。
(3)onprogressupdate(progress…) 可以使用進度條增加使用者體驗度。 此方法在主線程執行,用於顯示任務執行的進度。(如果是用此方法必須在doinbackground方法中使用publicprogress它傳入進度值)
(4)onpreexecute() 這裡是終端使用者呼叫excute時的介面,當任務執行之前開始呼叫此方法,可以在這裡顯示進度對話方塊。
(5)oncancelled() 使用者呼叫取消時被觸發。
注意以下情況:
(1)asynctask的例項必須在ui thread中建立;
(2)execute方法必須在ui thread中呼叫;同乙個例項只能執行一次execute方法。多次呼叫時將會丟擲異常。
例子:
publicview codeclass myasynctask extends asynctask
/*** 後台執行方法,比較耗時的操作都可以放在這裡。注意這裡不能直接操作ui。此方法在後台執行緒執行,
* 完成任務的主要工作,通常需要較長的時間。在執行過程中可以呼叫publicprogress()來更新任務的進度。
* 這裡的引數對應asynctask的第乙個引數, 這裡的返回值對應asynctask,第三個引數。
*/@override
protected
integer doinbackground(integer... params)
catch
(interruptedexception e)
}return
num;
}/*** 這裡的integer引數對應asynctask中的第三個引數(這個值就是doinbackground的返回值)
* 在doinbackground方法執行結束之後在執行,並且執行在ui執行緒當中 可以對ui空間進行設定
*/@override
protected
void
onpostexecute(integer result)
/*** 當任務執行之前開始呼叫此方法,可以在這裡提示使用者任務已經開始執行了。 該方法執行在ui執行緒當中,並且執行在ui執行緒當中 可以對ui空間進行設定
*/@override
protected
void
onpreexecute()
/*** 進度更新方法,此方法執行在ui執行緒中,因此可以操作ui
* 這裡的引數是在doinbackground方法中通過publishprogress方法傳入的。
*/@override
protected
void
onprogressupdate(integer... values)
/*** 取消asynctask任務時出發。integer引數是取消的時候doinbackground已經處理的結果。
*/@override
protected
void
oncancelled(integer result)
}
在acitivity中呼叫
myasynctask task=new myasynctask(txtview1,progressbar1);
task.excute(1000);//對應asynctask的第乙個引數
task.cancel(boolean);//取消任務,這個方法很有意思。有興趣的可以查查。
非同步執行緒之AsyncTask
1 使用新執行緒的原因 android的ui執行緒主要負責處理使用者的按鍵事件 使用者觸屏事件及螢幕繪圖事件,因此其它其它操作不應該 也不能阻止ui執行緒,否則ui介面將會變得停止響應。2 解決新執行緒不能更新ui元件的問題 2.1 使用handler實現執行緒通訊 2.2 activity.run...
AsyncTask非同步互動的用法簡介
首先定義乙個類,繼承asynctask類,並實現相關方法 author wjl 第乙個泛型 規定doinbackground方法的引數型別,規定asynctask.execute方法傳遞的引數型別 第二個泛型 規定onprogressupdate方法引數的型別,publishprogress引數型別...
AsyncTask 非同步處理
1,object,用於指定doinbackground的引數 2,integer,用於指定onprogressupdate的引數 3,uri,用於指定doinbackground的返回型別和onpostexecute的引數型別 public class updatetask extends asyn...