asynctask是乙個抽象類:params執行任務要輸入的引數的型別(url等等),progress後台完成任務進度值的型別,result後台任務結束返回結果的型別;
一般在主線程中定義這個內部類(共享元件等等),實現這個類要自定義類繼承它,終點重寫四個方法:
1.doinbackground():耗時任務執行的地方;
2.onpreexecute():一般用來顯示任務進度條,最先執行
3.onprogressupdate():一般用來更新進度條的進度值;
4.onpostexecute():當任務完成時,將結果返回在這個方法中;
建立這個asynctask子類物件,並實現execute(params)方法來開始執行任務;
注意:必須在ui中建立asynctask物件和實現它的execute方法;每個asynctask只能被執行一次,不能多次;
asynctask類似於handle,它更輕量級,封裝了執行緒和handle,不適合執行耗時長的任務;
asynctask通過乙個blockingquery儲存任務,任務在android3.0以前是並行任務執行器,在3.0之後是序列任務執行器,利用thread_pool_executor預設提供的128個執行緒處理任務;
配置後的執行緒池如下:
1.核心執行緒數等於cpu核心數+1;
2.執行緒池的最大執行緒數為cpu核心數的2倍+1;
3.任務佇列容量為128;
主要由執行緒池+hanlder實現的
當執行execute()方法,會呼叫executeonexecutor方法,將引數賦值給乙個worker物件,即callable任務,最終被封裝成futuretask進行任務的執行,執行的時候通過使用serial_executor,即乙個序列執行器,通過schedulenext不斷去取出它內部單項任務佇列中的task,並交給執行緒池進行任務處理
new threadpoolexecutor(交給上述這樣的乙個執行緒池進行處理之後,把worker物件計算出來的結果通過handler傳送訊息,並最終執行onpostexecute進行結果返回;1, 20, keep_alive_seconds, timeunit.seconds,
new synchronousqueue(), sthreadfactory)
注:1.execute中executeonexecutor呼叫了onpreexecute,該方法是ui執行緒中執行,所以execute一定要在ui執行緒中執行;
2.乙個aysnctask只能執行一次,如下圖因為execute前會判斷task的狀態是否執行過或正在執行;
3.asynctask
是封裝了thread
和handler
,為了能夠將執行環境切換到主線程這就要求原始碼中的handler
物件繫結主線程因此asynctask
物件應該在主線程建立;
4.aysnctask預設是單執行緒執行,如果想讓它多執行緒執行,可以使用executeonexecutor(executor exec, params... params),傳乙個自定義的executor進行改造;
Android AsyncTask非同步任務
asynctask能夠適當地 簡單地用於 ui執行緒。這個類准許執行後台操作,讓那些沒有熟練操作執行緒的操作者在 ui執行緒上發布結果。非同步任務的定義是乙個在後台執行緒上執行,其結果是在 ui執行緒上發表的計算。非同步任務被定義成三種一般型別 params,progress和 result 四步 ...
android AsyncTask非同步任務
asynctask params 啟動任務執行的輸入引數型別 progress 後台任務完成的進度值型別 result 後台執行任務完成後返回結果的型別 使用asynctask只要如下三步即可 doinbackground params。重寫該方法就是後台執行緒將要完成的任務,該方法可以呼叫publ...
redis crontab php非同步處理任務
2016年1月8日 16 08 43 星期五 情景 使用者登入日誌,發郵件,發簡訊等等實時性要求不怎麼高的業務通常會非同步執行 之前接觸過幾種redis crontab配套的實現方法,比如 crontab定時執行curl指令碼 1.用curl 訪問url執行php指令碼去pop佇列 2.php程式p...