Android非同步任務 AsyncTask 筆記

2021-06-26 13:35:32 字數 1826 閱讀 3376

像handler訊息傳遞機制類似,android官方提供的專門用於處理耗時超作,並及時更新ui元件的乙個抽象類.

常用於耗時操作,如網路操作,資料庫操作,等大量的耗時操作.

asynctask是個抽象類,這一屬性決定我們運用時要繼承該類,並實現該類中的方法.

params: 1.execute(params...)方法中的引數型別;

2.doinbackground(params...)方法中的引數型別.

progress: 1.publishprogress(progress...)方法中的引數型別;

2.onprogressupdate(progress...)方法中的引數型別.

result: 1.result doinbackground(params...)方法中的返回值型別.

2.onpostexecute(result)方法中的引數型別.

...為可變引數型別,理解:編譯器會將形參轉變成乙個陣列形參,

這樣我們就可以用過params[0],或params[1]等下標方法來獲取形參的值.

下面說的執行次序的前提是下面的所有方法都被呼叫 序號

方法名執行者

執行次序

**執行

方法說明

1execute(params...)

asynctask例項

-主線程

通過建立asynctask例項,並呼叫該方法後,就會啟動非同步任務

2onpreexecute()

系統呼叫

1主線程

用於完成一些初始化的準備工作

3result doinbackground(params...)

系統呼叫

2後台執行緒

用於完成耗時工作

4publishprogress(progress...)

系統呼叫

3在doinbackground方法中呼叫

用於通知主線程更新任務的進度

5onprogressupdate(progress...)

系統呼叫

4主線程

用於更新任務的進度,(publishprogress方法呼叫後會觸發該方法的呼叫)

6onpostexecute(result)

系統呼叫

5主線程

用於處理結果

1.繼承asynctask抽象類,實現自定義的非同步任務.

2.自定必要的引數型別,重寫需要的方法.

3.在主線程建立asynctask的例項,並呼叫execute()方法就ok了!

在android3.0後,非同步任務改變為順序執行,即如果連續兩次或多次呼叫非同步任務時(new asynctask().execute()),

系統會按照執行順序乙個乙個地執行非同步任務,而不會併發地執行它們.

怎樣才能使其併發地執行?

在android3.0後,增加了乙個方法:

executeonexecutor(executor exec, params... params)

我們可以使用該方法,將第乙個引數設定為併發執行,那麼非同步任務改變為併發執行.

對於第乙個引數executor exec的理解;

該引數要求傳入乙個執行緒池物件,即傳入乙個(executors.newcachedthreadpool())執行緒池物件,

或者使用android官方提供的執行緒池物件,android官方對於第乙個引數提供了兩個物件供我們使用,分別為:

asynctask.thread_pool_executor 如果使用其設定第乙個引數,非同步任務就會改變為併發執行.

asynctask.serial_executor 如果使用其設定第乙個引數,非同步任務還是順序執行,與execute()一樣

Android 非同步任務AsyncTask

handler本身並沒有建立子執行緒。如果要在子執行緒中執行任務,必須使用者自己建立子執行緒,然後在子執行緒中呼叫handler.sendmessage 更新ui。android提供另乙個類asynctask執行這樣的非同步任務。asynctask類會建立子執行緒,其內部封裝了handler。asy...

Android 非同步任務AsyncTask

首先,繼承asynctask 引數說明如下 params標示輸入引數。progress標示子執行緒執行的百分比。result標示返回值型別。根據需求實現如下方法 onpreexecute 方法。doinbackground params.params 方法。publishprogress param...

android非同步任務之IntentService

這裡我們來看看原始碼,intentservice的 很少,很簡單。在第一次oncreat的時候,建立了乙個handlerthread。然後建立了乙個handler,將handlerthread的loop傳了進去,相當於這個handler的執行已經是非同步了。1 oncreat handlerthre...