Android事件處理之五 非同步任務

2021-06-28 12:38:45 字數 1946 閱讀 4359

asynctask

android的ui執行緒主要負責處理使用者的按鍵事件、使用者觸屏事件及螢幕繪製事件等,因此開發者的其它操作不應該也不能阻塞ui執行緒

為避免ui執行緒失去響應,android建議將耗時操作放在新執行緒中完成,但新執行緒可能需要動態更新ui元件,而新執行緒是不允許直接更新ui元件的。

為解決新執行緒不能更新ui元件這乙個問題,android提供了如下方案:

handler處理已作說明,而後三種方式程式設計略顯繁瑣,而非同步任務(asynctask)則可進一步簡化這種操作

asynctask是抽象類,它定義了如下三種泛型:

使用asynctask的3個步驟:

建立asynctask子類,並為三個泛型引數指定型別(不需要的可指定為void)

據需要,實現asynctask的方法:

fun1:doinbackground(params):重寫該方法就是後台程式將要完成的任務,該方法可以呼叫publishprogress(params..)更新任務執行進度

fun2:onprogressupdate(progress

…value):在doinbackground()方法中呼叫publishprogress()更新進度後將觸發該方法

fun3:onpreexecute():該方法將在執行後台耗時操作前被呼叫。通常用於完成一些初始化的操作,如在介面上顯示進度條

fun4:onpostexecute(result result):當doinbackground()完成後,系統會自動呼叫onpostexecute()方法,並將doinbackground方法的返回值傳給該方法

3.呼叫asynctask子類的例項的execute(params... params)開始執行耗時任務

使用asynctask時必須遵守如下規則:

1.必須在ui執行緒中建立asynctask例項

2.必須在ui執行緒中呼叫asynctask的execute()方法

3.asynctask的onpreexecute()、onpostexecute(result result)、doinbackground(params params),onprogressupdate(progress values)方法由android系統負責呼叫

4.每個asynctask只能被執行一次,多次呼叫將會引發異常

示例**如下:

public

class

mainactivity

extends

activity

public

void

download(view source)

throws

malformedurlexception

class

downtask

extends

asynctask

@override

protected

string doinbackground(url... params)

return

sb.tostring();

}catch

(exception e)

return

null;}

@override

protected

void

onpostexecute(string result)

@override

protected

void

onpreexecute()

@override

protected

void

onprogressupdate(integer...values )}}

另外,程式需要使用網路,所以需要在android_manifest.xml檔案中宣告許可權

<

uses-permission

android:name="android.permission.internet"

/>

Android 事件處理

view 提供了若干事件.在渲染 布局 展現 相關事件的觸發順序總結如下 constructors onfinishinflate 當view和它的所有子物件從xml中匯入之後,呼叫此方法 layout onmeasure int,int view會呼叫此方法,來確認自己及所有子物件的大小 onla...

Android事件處理

按鍵捕獲先後順序 驅動層 系統層 library層 框架層 應用層。應用層return false,事件會繼續向底層傳遞。應用層return true,事件終止不再傳遞。呼叫super方法,activity會決定事件處理方式以及是否向底層傳輸。return false和return true會導致按...

事件驅動之非同步事件

public void head private void raiseevent headedevent headedevent 所以我們只需在 裡raiseevent就可以了。其實很簡單,因為我們要實現的是同步的事件,我們只需要找到所有處理這個事件的實現類,然後呼叫所有就可以了。public in...