AsyncTask原理精簡版

2021-07-09 06:23:20 字數 1938 閱讀 7036

asynctask有三個主要的方法

onpreexecute()

doinbackground(string...params

onpostexecute()

建立asynctask物件需要重寫乙個類繼承asynctask,因為asynctask本身是抽象類

new asynctask().execute(params...params)(從此處入口

這個方法體裡就呼叫了onpreexecute()

有乙個status的列舉類

asynctask的初始狀態為pending,代表待定狀態,running代表執行狀態,finished代表結束狀態,這幾種狀態在asynctask一次生命週期內的很多地方被使用

//改變狀態為running  

mstatus = status.running;  

//呼叫onpreexecute方法  

onpreexecute();  

//把引數賦值給mworker物件

mworker.mparams = params;  

//在構造方法中,建立了乙個workrunnable實力物件(它實現了callable介面中的call()方法),並將物件封裝給futuretask物件

在futuretask的構造中,又把mworker封裝給sync物件

//執行緒池執行mfuture物件,此物件是futuretask的物件,futuretask實現了runnable介面

***ecutor.execute(mfuture);

//(以下都是在futuretask中...

mfuture的run方法呼叫了sync.innerrun(),在innerrun方法中,呼叫了

callable的call方法(sync在被建立的時候,在構造方法中就已經把mworker賦值

給了callable,實際上就是呼叫mworker的call方法

return doinbackground方法(子執行緒中

return的值給了result,然後呼叫了set(result) 跳轉到sync.innerset(v v) v就是

result ,再呼叫了done()方法,該方法為空,由子類來繼承實現

子類就是那個mfuture

定義是在asynctask

裡面的message.sendtotarget() 裡面就是呼叫了handler.sendmessage(msg)方法

必然會觸發handlermessage

而message由shandler建立,則會觸發shandler.handlermessage

shandler例項實際上是asynctask內部類internalhandler的例項,而internalhandler正是繼承了handler

找到message_post_result = 0x1; //顯示結果

裡面就呼叫了finish()方法,而finish()方法裡就呼叫了onpostexecute方法

該方法裡有:

asynctaskresult result = (asynctaskresult) msg.obj;  

asynctaskresult是asynctask的乙個內部類,是用來包裝執行結果的乙個類

asynctaskresult封裝了乙個asynctask的例項和某種型別的資料集

result.mtask.finish(result.mdata[0]);

result.mtask.finish(result.mdata[0]);

//非同步執行緒的缺陷:

.excute方法裡 呼叫了excuteonexecutor 傳入的是預設的exector實現物件,而該物件的excute方法加了個同步鎖synchronized,使得只能一次執行乙個執行緒

我們修改這缺陷,只需要呼叫.xecuteonexecutor(asynctask.thread_pool_executor, task)就可以實現併發執行了

RPC 實戰與原理 精簡版

動態 實現 http 2 特性 為什麼需要服務發現?定時任務 時間輪 如何註冊和發現服務?如何實現 rpc 遠端呼叫?如何追蹤微服務?註冊中心選型 開源 rpc 框架 spring cloud 微服務架構 remote procedure call,遠端過程呼叫。網絡卡等操作,只能通過核心操作,應用...

Sql優化精簡版

1.select語句中避免使用 盡量應該根據業務需求按欄位進行查詢 2.刪除重覆記錄 delete from tble tb where tb.id select min id from tble ble where tb.name ble.name 3.用 替換 4.盡量多使用commit 如對大...

github 使用精簡版

使用git bash上傳時,必須進入需要上傳的檔案的目錄,例如我要上傳的檔案在c 1 1 1 upload 那麼我就要進入到c 1 1 1,然後用以下命令上傳檔案 刪除 git rm cached r useless git commit m remove directory from remote...