AsyncTask 原始碼分析

2021-09-22 01:37:35 字數 4496 閱讀 7952

asynctask 內部實現原理主要是兩個執行緒池和乙個handler。

兩個執行緒池分別為serialexecutor和threadpoolexecutor。

其中serialexecutor是維護乙個有序佇列;threadpoolexecutor是執行任務的執行緒池。

handler是internalhandler 執行非同步操作的。

1.首先我們先來看下asynctask 的構造方法。

public

asynctask

(@nullable looper callbacklooper)

catch

(throwable tr)

finally

return result;}}

; mfuture =

newfuturetask

(mworker)

catch

(interruptedexception e)

catch

(executionexception e)

catch

(cancellationexception e)}}

;}

從構造方法中我們可以看出 初始化了乙個handler,以及初始化workerrunnable並實現了call()方法,還有初始化futuretask並實現done()方法。

我們接著往下看

workerrunnable實際是乙個callable

private

static

abstract

class

workerrunnable

implements

callable

futuretask是runnable和future的子類

public

class

futuretask

implements

runnablefuture

public

inte***ce

runnablefuture

extends

runnable

, future

構造方法介紹完畢我們看下execute();的執行方法

@mainthread

public

final asynctask

execute

(params.

.. params)

@mainthread

public

final asynctask

executeonexecutor

(executor exec,

params.

.. params)

}// 將asynctask狀態設定為running狀態

mstatus = status.running;

// 主線程初始化工作

onpreexecute()

;// 新增引數到任務中

mworker.mparams = params;

// 執行任務

// 此處的exec = sdefaultexecutor = 任務佇列 執行緒池類(serialexecutor)的物件

exec.

execute

(mfuture)

;return

this

;}

可以看到實際上是sdefaultexecutor執行了execute方法,那我們看下sdefaultexecutor實際是乙個serialexecutor執行緒池的物件

private

static

volatile executor sdefaultexecutor = serial_executor;

public

static

final executor serial_executor =

newserialexecutor()

;

那麼我們看下serialexecutor

private

static

class

serialexecutor

implements

executor

finally}}

);// 若當前無任務執行,則去佇列中取出1個執行

if(mactive == null)

}protected

synchronized

void

schedulenext()

}}

這裡面的runnable其實就是我們傳入的futuretask物件

這裡首先是先將乙個個新任務加入佇列然後schedulenext方法從佇列的頭部取出任務乙個個的執行。

執行任務的時候呼叫了futuretask的run方法實際上就呼叫了mworker的call()方法

public

class

futuretask

implements

runnablefuture

public

void

run(

)catch

(throwable ex)

if(ran)

set(result);}

}finally

}

這裡的call物件實際就是在構造方法中傳入的mworker物件。

接著我們看下call()的實現方法就在構造方法中

mworker =

newworkerrunnable

()catch

(throwable tr)

finally

return result;}}

;

可以看到這裡執行了doinbackground 耗時任務 執行完把結果發給postresult

doinbackground 就是我們需要執行非同步任務的地方

這裡給出了呼叫的demo

asynctask asynctask =

newasynctask()

@override

protected

void

onpostexecute

(object o)};

asynctask.

execute()

;

分析postresult(result)

private result postresult

(result result)

這裡的gethandler實際就是internalhandler

postresult方法給internalhandler 傳送了乙個message message_post_result和乙個 asynctaskresult

private

static

class

internalhandler

extends

handler

@suppresswarnings()

@override

public

void

handlemessage

(message msg)

}}

result.mtask實際就是asynctask自己

private

static

class

asynctaskresult

}

internalhandler 接受到message_post_result執行asynctask的finish方法

private

void

finish

(result result)

else

mstatus = status.finished;

}

這裡就執行了我們實現的oncancelled或onpostexecute

總結1.任務執行緒池類(thread_pool_executor)實際上是1個已配置好的可執行並行任務的執行緒池

2.呼叫thread_pool_executor.execute()實際上是呼叫執行緒池的execute()去執行具體耗時任務

3.而該耗時任務則是步驟2中初始化 workerrunnable例項物件時複寫的call()內容

4.在call()方法裡,先呼叫 我們複寫的doinbackground(mparams)執行耗時操作

5.再呼叫postresult(result), 通過 internalhandler 類 將任務訊息傳遞到主線程;根據訊息標識(message_post_result)判斷,最終通過finish()呼叫我們複寫的onpostexecute(result),從而實現ui更新操作

AsyncTask原始碼分析

就從asynctask的構造方法開始分析 creates a new asynchronous task.this constructor must be invoked on the ui thread.public asynctask mfuture new futuretask mworker...

7 0 AsyncTask原始碼分析

之前開發中經常使用asynctask進行非同步資料獲取,當時只限於使用,只知道大體的就是通過執行緒池 handler實現的封裝,具體的 細節沒有仔細看過,今天就閱讀一下原始碼,當作筆記。加深記憶 public asynctask mfuture new futuretask mworker catc...

AsyncTask非同步任務機制原始碼分析

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...