Android中Handler的執行緒間通訊原理

2021-06-03 22:41:20 字數 968 閱讀 9338

就是要把handle物件傳遞的東西放在乙個訊息迴圈的佇列當中,如果沒有這個訊息迴圈佇列的話,就會報錯!

在做比較簡單執行緒通訊的時候,我們只是在主activity執行緒中使用handler.sendmessage(message)方法來實現訊息的傳送,用handler.handlemessage(message)類實現訊息的獲取,這似乎沒有什麼錯誤,而且如果在我們自己開啟的普通執行緒中向主activity執行緒傳送訊息似乎也不會有什麼錯誤,可以捕獲我們想要的訊息。

但是如果我們接收訊息的執行緒不在主線程那麼而是乙個普通執行緒,那麼就會報錯。為什麼會這樣呢?原因就是因為在我們自定義的普通執行緒中沒有訊息迴圈佇列。那麼怎麼來實現乙個訊息迴圈佇列呢?(假設我們都複寫了handlemessage(message)方法)

1.這是最簡單的方法,是在例項化handler物件的時候傳入呼叫handlerthread.getlooper()獲得的looper物件,這個looper就是我們需要的訊息迴圈佇列。當然這個handlerthread物件必須呼叫start()方法去讓他開啟的執行緒執行。

2.這個方法是模仿handlerthread類的run()方法寫出來的。就是在定義handler物件的前加上looper.prepare()方法,讓訊息迴圈開始準備,在定義完以後在呼叫looper.loop();然訊息迴圈開始執行。其實這兩個方法本質上是沒有沒有區別的,都是給乙個普通執行緒新增了乙個訊息佇列。

那麼為什麼在activity中就沒有什麼問題呢?

原因是activity其實什麼也不是,只是乙個大怪物,他把很多功能都整合到了一起,並且把他封裝起來,當然也包括乙個訊息迴圈佇列(這個訊息迴圈佇列由系統來維護),所以在簡單的主activity中用handler傳遞訊息不會報錯。有人說activity是介面其實並不是這樣的,我們看到的只不過是乙個window或者view,他用window的功能監聽事件,用view的功能顯示介面,還有整合了資料儲存等功能,等等。在此只講handler,過多的activity知識這裡只做了解。

原檔案出自

android中Handler的用法

寫了乙個demo,如下 public class mainactivity extends activity endbutton.setonclicklistener new onclicklistener 建立handler物件 handler handler new handler runnab...

android中的Handler機制

一 為什麼要用handler 之所以需要跨執行緒通訊是因為在 android 中主線程通常只負責 ui 的建立和修改,子執行緒負責網路訪問和耗時操作,因此,主線程和子執行緒需要經常配合使用才能完成整個 android 功能,這時候就有了handler的出現。二 什麼是handler 訊息佇列,先進後...

Android中的Handler機制

1 android系統不允許在主線程中執行耗時操作。activity和service不超過5秒,boroadcastreceiver元件廣播不超過10秒 2 耗時操作交給工作執行緒去完成。有時,耗時工作完成後,需要通知主線程 需要更新ui元件,需要有一種機制在主線程和工作現場之間進行通訊。這是機制在...