Handler的三種互動場景

Songlcy發表於2016-07-18

前些天有朋友問了我一個問題,他說他在面試平安的時候,面試官問了一個這樣的Question:Handler有哪三種互動場景?

其實,當我聽到這個問題的時候,我腦海中閃現的想法是面試官其實在考Handler在子執行緒的實現方式。沒錯,其實Handler的互動方式可以分為如下三種:

(1)子執行緒與子執行緒互動

(2)主執行緒傳送訊息到子執行緒

(3)子執行緒傳送訊息主執行緒

乍一看,其實上面的(2)和(3)原理是差不多的,我們可以理解成是雙向的關係。

我之前寫過一篇從原始碼角度分析Handler的部落格,其中就分析到了為什麼我們可以在UI執行緒(也就是主執行緒)直接使用Handler傳送訊息。如果對這塊瞭解了,那麼今天的這三個問題就很容易。還沒有看的小夥伴點選這裡:玩轉Android Handler

下面的內容我會以程式碼的方式來分別和大家分析3種的實現方式。

(1)子執行緒與子執行緒互動

可能突然看這個問題,就有點無所適從。不過仔細想想,然後聯想主執行緒的Handler就很容易理解了。你可以把主執行緒也當做一個子執行緒,這樣想這個問題就迎刃而解了。這種情況同時也分為了如下兩種場景:


 1>子執行緒中使用Handler向另一個子執行緒發訊息(單向)


即建立兩個執行緒,並在一個執行緒傳送訊息到另一個執行緒處理。程式碼很簡單,相信大家一看就懂。

2>兩個子執行緒互發訊息(雙向)


上面程式碼中,分別建立了兩個執行緒MyThread1和MyThread2的例項。並且通過各自執行緒的Handler向對方傳送訊息。

(2)主執行緒發訊息到子執行緒。

既然是主執行緒發訊息到子執行緒,那麼Handler的處理肯定是在子執行緒。那麼我們就需要在子執行緒中去建立Handler。還記得我們之前分析原始碼的時候我們說過,Handler的使用離不開Looper的支援。主執行緒可以使用Handler的原因是因為ActivityThread在建立的時候預設幫我們建立了Looper。即MainLooper。現在我們要在子執行緒中去建立Handler,那麼就需要我們手動去建立Looper。OK,看如下程式碼:


從上面程式碼可以看到,我們在子執行緒中建立了Looper。在主執行緒Button的單擊事件中去傳送訊息。子執行緒中接受到訊息後處理。相信大家一看便知。

其實還有一種實現方式,想必大家平時用的不是特別多,就是使用HandlerThread類來實現。

HandlerThread,顧名思義,可以簡單理解為一個Handler執行緒類。我們使用該類就可以建立一個Handler的執行緒類,然後將其和Handler繫結起來,然後Handler的處理就在該執行緒中執行了。同樣看程式碼就可以很清楚的明白其中的原理:


總之,記住一點就可以了。Handler的使用離不開Looper的支援,要想在子執行緒中使用Handler,Looper的建立必不可少。

第三個子執行緒傳送訊息到主執行緒就不再多說了,我們平時都在接觸。Ok,關於Handler的三種互動場景就介紹到這裡了,相信大家對Handler又有了新的認識。有問題的筒靴可以給我留言啦~




相關文章