Android重新學習記錄和心得(一)--Handler、Thread、AsyncTask等

1.關於Handler,MessageQueue,Looper,Message

https://blog.csdn.net/sinat_20059415/article/details/79178564

主要講了Handler的message發送,消息的同步異步。以前只知道Handler可以發送消息,然後一般通過handlerMessage方法來接收各種消息,發現其實Handler還可設置callback,callback會先執行,主要用來做消息的分類,或者多個地方調用Handler。Message也可以帶Callback,只不過該方法是隱藏的。

默認的handler執行時是按照MessageQueue的順序同步執行,一個Looper只允許有一個MessageQueue,但是可以有多個Handler,其實也可以讓消息異步立刻執行,需要設置MessageQueue的postSyncBarrier,設置之後會默認生成一個target爲null的消息,這時所有同步的消息將都得不到執行,只會執行異步消息,只有消息執行完之後,使用removeSymcBarrier,纔會繼續執行後續的同步消息。要執行異步消息,還需將Message設置爲Async纔行。

async機制可以用來做一些消息執行的時候,保證某個消息執行之後,其他消息纔會執行的動作

syncBarrier的用處可以參考:https://blog.csdn.net/cdecde111/article/details/54670136

更詳細的syncBarrier的講解參考:https://blog.csdn.net/asdgbc/article/details/79148180

 

2.關於HandlerThread和Intentservice

https://blog.csdn.net/sinat_20059415/article/details/79244762

HandlerThread其實是谷歌準備的自帶looper的thread,並且提供了鎖保護的機制,可以用使用這個來創建自己單獨運行的在某個線程的handler。

IntentService是爲了解決服務處理時間不能過長,裏面會自己啓動一個HanderThread,將待處理的任務放到單獨的線程中去執行,執行完畢後會關閉該service。

這裏學到了一點是stopService實際是帶有一個id的,如果有多個startService,會根據這個startid是否匹配來決定是否關閉service,這樣就會看到即使調用了stopService也不一定會關閉service。

目前還有問題是:startIntentservice始終都起不來service(後來發現犯了一個低級錯誤:

<service android:name=".MyService"/>,沒有再AndroidManifest中聲明這個service。

 

3.有關AsyncTask

https://blog.csdn.net/sinat_20059415/article/details/79304769

Async比較簡單,主要注意的是Async創建的時候帶三個參數AsyncTask<Params, Progress, Result>,其中:

Params是輸入參數,用於doInBackground

Progress是中間過程的參數,用於onProgressUpdate

Result是執行結束的參數,用於onPostExecute

其實從AsyncTask的源碼中可以看到,AsyncTask其實是支持將progress和Result放到其他的looperthread中執行的,只不過這種方式是隱藏的,還有需要注意的是默認所有的AsyncTask是共用一份線程池,並且順序執行,所以一個進程的多個異步任務會串行執行,如果需要並行執行,需要自己給定線程池。其實Async內部已經給出了答案,主要是調用AsyncTask.executeOnExecutor方法,傳入參數THREAD_POOL_EXECUTOR即可實現並行執行。

(其實,AsyncTask裏面是有兩個線程池,默認使用的是串行的線程池,有需要可以主動執行使用並行的線程池,可以多個CPU,啓動多個線程去做異步執行任務)

 

4.有關FutureTask相關

https://blog.csdn.net/sinat_20059415/article/details/79489341

總的來說,FutureTask是集成了Future和Runnable,一般配合線程使用,好處在於Future中帶了get()方法,該方法可以等待線程執行結束之後,返回執行的結果。配合Callable使用。

另外,學習到的一點是interrupt其實並不一定會阻止正在執行的線程,只是會中斷sleep,線程仍然會繼續執行,所以想要結束一個while循環的線程,還是需要配合判斷isInterrupt來使用,否則,線程是停止不了的。

另外學習到一個LockSupport,該方法其實就是處理線程的阻塞和喚醒的,park阻塞,unpack喚醒。

Future裏面其實是維護者一個狀態機,總的來說存在如下狀態:

NEW-->COMPLETING->NORMAL

NEW->COMPLETING->EXCEPTION

NEW->CANCELED

NEW->INTERRUTING->INTERRUPTED

調用cancel的時候如果是false,則還未執行完,則退出執行;已經正在執行,等待執行結束;如果是true,則還未執行完,退出執行,正在執行,調用interrupt,取消sleep

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章