Message、Handler、MessageQueue、Looper之間的關係

Looper是一個消息分發器,在主線程建立的時候就會建立一個Looper對象 oop

messageQueue :消息隊列,是由message組成的一個 隊列 spa

handler:從messageQueue中獲取到message,而後執行動做,能夠再主線程和子線程中互相傳遞數據 線程

看了源碼以後大概的說一下他們的關係: 對象

        在主線程建立以後會建立一個Looper對象,建立Looper對象的時候會去建立一個messageQueue,而Looper是一個輪詢器,會不停的輪詢messageQueue中的消息,在獲取到消息以後就會把這個消息交給handler來進行處理,在主線程中建立一個handler對象,這個handler對象不只能夠獲取到消息進行處理,也能夠把一個消息放到消息隊列中。 隊列

舉個例子來講明一下:       在子線程中更新UI 源碼

    根據安卓系統的機制,UI只能在主線程中更新,若是咱們想在子線程中更新UI,就要用到這一套機制了,在主線程和子線程之間傳遞信息。
     作法就是,如今主線程中建立一個handler對象,Looper對象和messageQueue對象是不用建立的,由於在系統源碼中這個是在主線程建立的時候就建立好的。而後重寫handlerMessage()方法,這個方法是在handler接收到message以後執行的方法,咱們把更新UI的代碼放到這個方法中。而後再子線程中用sendEmptyMessage()方法來發送一個消息到消息隊裏。在發送完這個消息以後,Looper這個輪詢器由於一直在輪詢消息隊列。得到到這個消息以後就會執行handlerMessage()方法,由於這個方法是在主線程中實現的。因此UI就能夠更新了。 消息隊列


handler機制:能夠再主線程中給子線程發送消息,也能夠再子線程中給主線程發送消息:
        子線程中給主線程發送消息:在主線程中建立一個handler對象,而後重寫handlmessage()方法,在子線程中調用handler.sendEmptyMessage()方法,而後再handlermessage()       方法中就能夠執行咱們想要執行的操做了,好比說更新UI 循環


        在主線程中給子線程發送消息:在子線程中new出來一個handler對象,而後重寫handlerMessage方法,在主線程sendemptymessage();只是這樣是不行了,由於handler要處理消息,可是在子線程中是沒有Looper對象的,咱們要經過Looper.prepar()來建立一個Looper對象, 在這裏Looper對像被建立的時候會建立一個MessageQueue,這樣就有Looper了,而後再執行完操做以後要執行如下Looper.loop()方法。去輪詢這些消息,讓handler來處理這些消息。在安卓的源代碼中,Looper.loop()方法是一個永遠爲true的while循環,因此咱們要在子線程中執行的動做,都要在這個方法前去執行,若是在這個方法後去執行的話,就不能被執行到 方法

相關文章
相關標籤/搜索