AsyncTask的工作原理

2021-08-21 01:40:12 字數 3525 閱讀 6599

在1.6之前,asynctask是序列執行任務的,1.6的時候asynctask開始採用執行緒池裡處理並行任務,但是從3.0開始,為了避免asynctask所帶來的併發錯誤,asynctask又採用乙個執行緒來序列執行任務。

具體執行流程,通過原始碼來分析:

public

asynctask() catch (throwable tr) finally

return result;}};

mfuture = new futuretask(mworker) catch (interruptedexception e) catch (executionexception e) catch (cancellationexception e) }};

}

在asynctask的建構函式中依次例項化了mworker和mfuture,asynctask的建構函式需要在ui執行緒上呼叫。

mworkermfuture

mfuture是乙個futuretask型別的物件,用mworker作為引數例項化了mfuture。在這裡,其實現了futuretask的done方法,當futuretask的任務執行完成或任務取消的時候會執行futuretask的done方法。

在例項化了asynctask物件之後,我們就可以呼叫asynctask的execute方法執行任務,execute**如下所示:

@mainthread

public final asynctaskexecute(params... params)

@mainthread

public final asynctaskexecuteonexecutor(executor exec,

params... params)

}mstatus = status.running;

onpreexecute();

mworker.mparams = params;

exec.execute(mfuture);

return

this;

}

execute方法呼叫了executeonexecutor方法,並且把sdefaultexecutor作為引數傳遞給了executeonexecutor,此處就能看出sdefaultexecutor是預設執行任務的executor了。

在executeonexecutor方法中,首先判斷asynctask的當前狀態,如果當前狀態為running或者finished丟擲illegalstateexception異常,不是以上兩種狀態則將當前狀態置為status.running,再執行onpreexecute()方法,executor的execute方法接收runnable引數,由於mfuture是futuretask的例項,且futuretask同時實現了callable和runnable介面,所以此處可以讓exec執行mfuture。進入sdefaultexecutor的execute方法檢視。

private

static

class

serialexecutor

implements

executor finally

}});

if (mactive == null)

}protected

synchronized

void

schedulenext()

}}

public

void

run() catch (throwable ex)

if (ran)

set(result);

}} finally

}

通過result = c.call();呼叫到上面說明的asynctask建構函式中的mworker的call()方法,執行doinbackground方法並返回結果,在finally中執行postresult方法,並將結果作為postresult方法的引數。

private result postresult(result result) 

private

static

class

internalhandler

extends

handler

@suppresswarnings()

@override

public

void handlemessage(message msg) }}

private

static

class

asynctaskresult

}

在postresult方法中傳送訊息,訊息的obj是asynctaskresult,包含asynctask和doinbackground方法返回的結果資料。交給internalhandler的handlemessage方法去處理,執行asynctask的finish方法

private

void

finish(result result) else

mstatus = status.finished;

}

呼叫到onpostexecute(result)方法,在onpostexcute方法中執行更新ui的操作,並將狀態置為status.finished。

asynctask預設是序列執行的,但是它也支援並行執行。

通過呼叫asynctask的executeonexecutor方法,傳入thread_pool_executor作為引數即可。

private

static

final

int core_pool_size = math.max(2, math.min(cpu_count - 1, 4));

private

static

final

int maximum_pool_size = cpu_count * 2 + 1;

private

static

final

int keep_alive_seconds = 30;

private

static

final threadfactory sthreadfactory = new threadfactory()

};private

static

final blockingqueuespoolworkqueue =

new linkedblockingqueue(128);

/*** an that can be used to execute tasks in parallel.

*/public

static

final executor thread_pool_executor;

static

參考:

AsyncTask原理淺見

asynctask的基原理是建立乙個執行緒池,通過執行緒池執行乙個runnable物件 futuretask 然後通過handler通知ui執行緒。1 執行緒池的建立。建立執行緒池,並返回乙個執行器物件 executor private static final int core pool size...

AsyncTask實現原理

asynctask是android提供的輕量級的非同步類,可以直接繼承asynctask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度 可以通過介面實現ui進度更新 最後反饋執行的結果給ui主線程 使用的優點 簡單,快捷,過程可控 ui的更新只能在主線程中完成。asynctask定義了三...

AsyncTask內部原理

asynctask 是乙個封裝了 threadpoolexecutor 和 handler 機制的抽象類,其作用是方便開發者進行多個非同步任務時無需手動在每個執行緒中都採用 handler 機制來通知 ui 執行緒進行操作,從而簡化了多個非同步任務與 ui 執行緒的通訊的情況.我們先留下幾個問題,在...