AsyncTask 非同步執行緒 用法

2022-03-15 11:52:23 字數 2505 閱讀 2719

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方法。多次呼叫時將會丟擲異常。

例子:

public

class 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)

}

view code

在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...