handler looper 和 執行緒

2022-03-25 18:09:03 字數 1991 閱讀 3259

handler的概念

顧名思義,handler在英語中是「操作著,處理者的意思」,而官方的文件給出的概念是,handler允許你傳送或者處理message物件或者runable物件,這兩個物件都是與執行緒的message queue相關聯的。每乙個handler的例項(乙個執行緒中可以有多個)都與單個的執行緒和那個執行緒對應的messagequeue 關聯,而處理的先後則按照傳送訊息的先後,先進先出進行處理。

根據自己的理解,handler主要負責message的傳送與訊息的處理。

如下面例子     handler handler=new handler();//負責允許runable物件

handler handler1 = new handler()//負責接受message物件

};runnable r=new runnable()});

m.sendtotarget();

} };

thread t=new

thread (r); //執行上面的runable

t.start();

我們來先看看結果:

從上面結果來看,可以得出一點結論,那就是不管是message還是runable物件,雖然是在別的執行緒通過handler傳送訊息,但是handler接到訊息後,處理過程還是在handler所在的那個執行緒中(也就是本例中的主線程中)

在網上有些文章說,message和runable是又兩個佇列來管理的,其實不是,我們不妨將

m.sendtotarget();移到

handler.post的前面

runnable r=new

runnable()});

} };

發現結果:

hanler1先執行了,說明,他們共用的乙個佇列。

實際上looper通過從message queue從取出乙個message,然後由優先順序的從高到底判斷

message的型別,有三種型別(     1) message裡面的callback,乙個實現了runnable介面的物件,其中run函式做處理工作;

2) handler裡面的mcallback指向的乙個實現了callback介面的物件,由其handlemessage進行處理;

3) 處理訊息handler物件對應的類繼承並實現了其中handlemessage函式,通過這個實現的handlemessage函式處理訊息。)

looper的概念

根據官方文件的概念(class used to run a message loop for a thread.)用來為執行緒處理訊息迴圈

而執行緒中預設是沒有looper的。為了給乙個執行緒建立looper,執行looper.prepar() 和looper.loop()

實現如下

class looperthread extends

thread

};looper.loop();}}

looper在執行loop()裡面處理訊息

有人說為啥主線程裡面沒有looper.prepare() 和looper.loop()呢,其實系統已經為主執行緒預設新增了這兩個方法,所以在主線程中,我們可以直接初始化handler。

下面再總結下:

每乙個執行緒都可以包含乙個looper和乙個訊息佇列

在android中ui執行緒(也即主線程)預設有乙個looper和訊息佇列

並且每乙個handler都有乙個對應得message queue,而且乙個執行緒中只有乙個message queue,通過handler向message queue 傳送訊息,有兩種方式傳送sendmessage,和post

兩者都可以更新ui執行緒。

經過測試,handler在哪個執行緒裡面,不管是傳送給他的message還是runale都在相對應的那個handler執行緒裡面執行(一般是 主線程)

這篇文章上面說的有問題

交叉線和直通線

2010 1 24 21 25 49 問 copper cross over與copper straight through兩種電纜有什麼區別?這兩種銅質電纜,我就是搞不懂有什麼不同!還有serial dte和serial dce兩種線的區別又是什麼呢?這兩種線與題目上的兩種線的接頭是不是一樣的呢?...

交叉線和直通線的區別和用途

一般裝置分為dce 資料通訊裝置 和dte 資料終端裝置 當dce 和dce 以及dte和dte 之間相連,也就是同種型別的裝置相連時間,我們用交叉線。當dce和dte 之間相連線,也就是不同種型別的裝置相連時間,我們一般使用直通線 即不同型別的裝置需要更簡單的連線,不宜是傳輸複雜化 常見的dce ...

微帶線和帶狀線

帶狀線 走在內層 stripline double stripline 埋在pcb內部的帶狀走線,如下圖所示 藍色部分是導體,綠色部分是pcb的絕緣電介質,stripline是嵌在兩層導體之間的帶狀導線。因為stripline是嵌在兩層導體之間,所以它的電場分布都在兩個包它的導體 平面 之間,不會輻...