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