在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 執行緒的通訊的情況.我們先留下幾個問題,在...