handler looper Message和線程池

1.首先Looper.prepare()在本線程中保存一個Looper實例,然後該實例中保存一個MessageQueue對象;因爲Looper.prepare()在一個線程中只能調用一次,所以MessageQueue在一個線程中只會存在一個。

2.Looper.loop()會讓當前線程進入一個無限循環,不斷從MessageQueue的實例中讀取消息,然後回調msg.target.dispatchMessage(msg)方法。

3.Handler的構造方法,會首先得到當前線程中保存的Looper實例,進而與Looper實例中的MessageQueue想關聯。或者是可以在handler構造方法中傳入一個Looper.

4.Handler的sendMessage方法,會給msg的target賦值爲handler自身,然後加入MessageQueue中。

5.在構造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調用的方法。

6.在Activity中,我們並沒有顯示的調用Looper.prepare()和Looper.loop()方法,爲啥Handler可以成功創建呢,這是因爲在Activity的啓動代碼中,已經在當前UI線程調用了Looper.prepare()和Looper.loop()方法。

7. Handler.post(Runnable r) 其實並沒有開啓一個線程,而是調用了sendMessage,所以handler 中Looper 所在的線程如果是UI線程,不能執行費事操作,否則會堵塞線程

詳細解釋請看http://blog.csdn.net/lmj623565791/article/details/38377229 

線程池 http://blog.csdn.net/seu_calvin/article/details/52415337

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