編輯:關於android開發
Android 的 Handler 機制(也有人叫消息機制)目的是為了跨線程通信,也就是多線程通信。之所以需
要跨線程通信是因為在 Android 中主線程通常只負責 UI 的創建和修改,子線程負責網絡訪問和耗時操作,
因此,主線程和子線程需要經常配合使用才能完成整個 Android 功能。
Handler 機制可以近似用圖 1 展示。MainThread 代表主線程,newThread 代表子線程。
MainThread 是 Android 系統創建並維護的,創建的時候系統執行了 Looper.prepare();方法,該方法內部
創建了 MessageQueue 消息隊列(也叫消息池),該消息隊列是 Message 消息的容器,用於存儲通過 handler
發送過來的 Message。MessageQueue 是 Looper 對象的成員變量,Looper 對象通過 ThreadLocal 綁定在
MainThread 中。因此我們可以簡單的這麼認為:MainThread 擁有唯一的一個 Looper 對象,該 Looper 對象
有用唯一的 MessageQueue 對象,MessageQueue 對象可以存儲多個 Message。
MainThread 中需要程序員手動創建 Handler 對象,並覆寫 Handler 中的 handleMessage(Message msg)
方法,該方法將來會在主線程中被調用,在該方法裡一般會寫與 UI 修改相關的代碼。
MainThread 創建好之後,系統自動執行了 Looper.loop();方法,該方法內部開啟了一個“死循環”不斷
的去之前創建好的 MessageQueue 中取 Message。如果一有消息進入 MessageQueue,那麼馬上會被
Looper.loop();取出來,取出來之後就會調用之前創建好的 handler 對象的 handleMessage(Message)方法。
newThread 線程是我們程序員自定 new 出來的子線程。在該子線程中處理完我們的“耗時”或者網絡
訪問任務後,調用主線程中的 handler 對象的 sendMessage(msg)方法,該方法一被執行,內部將就 msg
添加到了主線程中的 MessageQueue 隊列中,這樣就成為了 Looper.loop()的盤中餐了,等待著被消費。這是
一個很復雜的過程,但是
Android 顯然已經將這種模式給封裝起來了,就叫 Handler 機制。我們使用時只需要在主線程中創建 Handler,並覆寫
handler 中的handleMessage 方法,然後在子線程中調用 handler 的 sendMessage(msg)方法即可。
圖1 Handler原理圖
網頁源碼查看器:
activity_layout.xml:
[html] view plain copy工具類將字節流轉化為字符串 StreamUtls.java:
[java] view plain copyMainActivity.java
[java] view plain copy
最後在AndroidManifest.xml 中添加網絡訪問的權限
然後就大功告成了,運行一下去看看效果吧。如果有用就收藏一下吧!
android:Activity數據傳遞之對象(parcelable) 這篇文章裡面寫了用seralizable使對象序列化在Activity直之間進行傳遞 sera
MD5簡單實例,md5實例如圖當點擊按鈕時,會先判斷是否第一次登陸,如果是第一次登陸登陸則會彈出設置密碼的彈窗,若果登陸過則彈出登陸彈窗 其中輸入的密碼會用MD5加密下
Android的Kotlin秘方(I):OnGlobalLayoutListener,春節後,又重新“開張”。各位高手請繼續支持。謝謝! &nbs
Android中TouchEvent觸摸事件機制 當我們的手指在Android屏幕上點擊或滑動時,就會觸發觸摸事件TouchEvent。在App中ViewGroup和Vi