1、handler是什麼?
答:handler是更新ui介面的機制,也是訊息處理的機制,我們可以傳送訊息,也可以處理訊息
2、為什麼要有handler?
答:android在設計的時候,封裝了一套訊息建立、傳遞、處理機制,如果不遵循這樣的機制就沒辦法更新ui資訊,就會丟擲異常。
3、handler怎麼用?
答:1、post(runnable);
2、postdelayed(runnable ,long);
3、sentmessage
4、sentmessagedelayed
4、android為什麼要設定只能通過handler機制更新ui?
答:最根本的問題解決多執行緒併發的問題;
假設如果在乙個activity中,有多個執行緒去更新ui,並且都沒有加鎖機制,馬麼會產生生麼樣的問題?——更新介面混亂;
如果對更新ui 的操作都加鎖處理的話會產生什麼樣子的問題?——效能下降
對於上述問題的考慮,android提供了一套更新ui的機制,我們只需要遵循這樣的機制就好了。
不用關心多執行緒的問題,更新ui的操作,都是在主線程的訊息佇列當中輪詢處理的。
5、handler的原理是什麼?
答:1、handler封裝訊息的傳送(主要包括訊息傳送給誰)
2、looper——訊息封裝的載體。(1)內部包含乙個messagequeue,所有的handler傳送的訊息都走向這個訊息佇列;(2)looper.looper方法,就是乙個死迴圈,不斷地從messagequeue取訊息,如果有訊息就處理訊息,沒有訊息就阻塞。
3、messagequeue,乙個訊息佇列,新增訊息,處理訊息
4、handler內部與looper關聯,handler->looper->messagequeue,handler傳送訊息就是向messagequeue佇列傳送訊息。
總結:handler負責傳送訊息,looper負責接收handler傳送的訊息,並把訊息回傳給handler自己。
messagequeue儲存訊息的容器。
6、handlerthread的作用是什麼?
答:handlerthread thread=newhandlerthread("handler thread");自動含等待機制,等looper建立好了,才建立handler,避免出現空指標異常。
7、主線程
* activitythread 預設建立main執行緒,main中預設建立looper,looper預設建立messagequeue
* threadlocal儲存執行緒的變數資訊,方法包括:set,get
8、android更新ui的方式?
答:1、runonuithread
2、handler post
3、handler sendmessage
4、view post
9、非ui線**的不能更新ui嗎?
10、使用handler遇到的問題?
答:比如說子執行緒更新ui,是因為觸發了checkthread方法檢查是否在主線程更新ui,還有就是子執行緒中沒有looper,這個原因是因為handler的機制引起的,因為handler傳送message的時候,需要將message放到messagequeue裡面,而這個時候如果沒有looper的話,就無法迴圈輸出messagequeue了,這個時候就會報looper為空的錯誤。
11、主線程怎麼通知子執行緒?
答:可以利用handlerthread進行生成乙個子執行緒的handler,並且實現handlermessage方法,然後在主線程裡面也生成乙個handler,然後通過呼叫sendmessage方法進行通知子執行緒。同樣,子執行緒裡面也可以呼叫sendmessage方法進行通知主線程。這樣做的好處比如有些的載入啊,網路的訪問啊可能會比較耗時,所以放到子執行緒裡面做是比較合適的。
Android Handler訊息機制
handler訊息機制 優點 寫法 1.主線程中建立乙個handler物件 handler handler new handler 2.複寫handler物件的handlermessage方法 public void handlemessage android.os.message msg 3.在子...
Android Handler 工作原理
handler message messagequeue looper 1.looper.prepare public static void prepare private static void prepare boolean quitallowed 這裡建立的looper sthreadloc...
android handler呼叫post方法阻塞
1.試下用postdelayed runnable a,int time 因為post把訊息放到looper中就返回,但looper中沒有其他訊息又會被立刻取出來執行,這樣就有可能做了run中的操作,而沒有及時重新整理按鈕.2.另外,這種做法耗時操作仍然是由ui執行緒去做了。而不是你想的另起了執行緒...