-
handler.sendMessage(msg); 這個其實是向handler發送信息msg,handler對應的Looper接收信息并存到對應的messagequeue中,待輪詢到時,拿出該msg在handleMessage函數中操作。查看全部
-
handler與handlerThread的配合使用。實際上,handlerThread的作用就是給主線程的handler提供一個Looper,以達到在子線程(即handlerThread)中執行耗時操作,然后把操作的結果直接給到主線程去使用(handler的handleMessage函數)。查看全部
-
Handler與Looper、MessageQueue的關系(原理) 1. Handler機制? 只要遵循Android使用handler來更新UI的機制,我們就不用關心多線程的問題,所有的更新UI的操作都是在主線程的消息隊列中去輪詢處理的。(如圖) 2. Handler封裝了消息的發送 (1)handler獲取一個message handler.obtainMessage(); obtainMessage()的源碼: public final Message obtainMessage() { return Message.obtain(this); //這里this本身就是handler對象 } Message.obtain()的源碼: public static Message obtain(Handler h) { Message m = obtain(); m.target = h; //m.target就是Message的目的地,將handler本身賦給它,就說明目的地就是handler本身 return m; } 3. Looper (1)Looper作為一個消息封裝的載體,包含了一個消息隊列messageQueue,所有的Handler發送的消息都經過這個消息隊列——要發送的消息會往這個消息隊列中插入或移除。 (2)Looper.loop()方法是一個死循環,不斷輪詢messageQueue,如果有消息存在取出并發送給handler,然后handler處理消息,沒有就阻塞 4. Handler 內部會和Looper進行關聯,也就是說在Handler內部可以找到Looper,找到了Looper也就找到了MessageQueue。調用handler.sendMessage()就是向消息隊列中發送消息;然后Looper輪詢MessageQueue,將message發送給Handler本身進行處理。 5. MessageQueue 一個消息隊列,可以添加消息,并處理消息 6. 總結: handler負責發送消息,Looper負責接收Hnandler發送的消息,并直接把消息回傳給hanlder自己。MessageQueue是一個存儲消息的容器。查看全部
-
Handler——簡介和用法(對應MainActivity) (接上一筆記) 7. 使用Handler的sendMessage()和handleMessage() handleMessage() private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { mTextView.setText("" + msg.arg1); }; }; 主線程中新建一個Thread發送message給主線程。 new Thread() { public void run() { Message message = handler.obtainMessage(); message.arg1 = 88; handler.sendMessage(message); }; }.start(); 9. 移除runnable對象 對應于handler.postDelayed(myRunnable, 2000);直接handler.removeCallbacks(myRunnable); 10. 截獲message 在創建handler對象時,調用new Handler(Callback callback)方法。 private Handler handler = new Handler(new Callback() { public boolean handleMessage(Message msg) { return true; //return true就截獲,return false不截獲 } }){ public void handleMessage(Message msg) { } }; 在主線程中執行handler.sendEmptyMessage(1)。其原理: 當Handler收到message時,新創建的Callback將首先執行,其handleMessage()將會處理消息;如果Callback的handleMessage()不截獲消息,然后Handler才可能會收到消息。查看全部
-
Handler——簡介和用法(對應MainActivity) 1.handler是android給我們提供用來更新UI的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它處理消息; Activity中的回調方法(onCreate、onResume等)真正在Framework中都是通過handler來實現的,它會根據不同的message回調不同的方法。 2.為什么要用handler,是因為android在設計的時候,就封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制就沒有辦法更新UI信息,就會拋出異常信息; 3. 可以創建自己的線程,然后通過hanlder和主線程通信——在該線程中調用sendMessage(Message)或post(Runnable)等和主線程通信,其中的Runnable或Message對象將會被加入到主線程Handler的message queue中,然后被處理。 4. 在主線程中更新UI會拋出異常 07-26 09:12:55.826: E/AndroidRuntime(14673): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 5. 簡單的更新UI的方法(如圖) new Thread().start()創建了一個新的線程并執行,在這個線程中執行run()去post一個Runnable對象給主線程。這個Runnable對象的run()在主線程中執行,更新textView。 6. 最后一個實現圖片循環的例子 在主線程中使用handler.postDelayed(myRunnable, 2000)是post一個myRunnable給主線程。同時,在MyRunnable的run()中再post一個myRunnable,如此循環。查看全部
-
handler的原理查看全部
-
handler負責發送消息,Looper負責接收Handler發送的消息,并直接把消息回傳給handler自己查看全部
-
handler查看全部
-
1.handler是android給我們提供用來更新UI的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它處理消息; 2.為什么要用handler,是因為android在設計的時候,就封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制就沒有辦法更新UI信息,就會拋出異常信息;查看全部
-
handler負責發送消息,Looper負責接收Handler發送的消息,并直接把消息回傳給handler自己查看全部
-
ViewRootImpl是在onResume方法中創建了查看全部
-
HandlerThread的用處: 創建Handler的時候可以指定Looper,所以這個Looper對象可以是別的線程創建的。所以Handler中MessageQueue的輪詢不一定非要是創建Handler的線程進行,還可以別的線程進行。但是進行的時候需要我們保證傳入的looper對象已經被別的線程創建好了,否則會出現空指針異常。這個時候我們就需要使用HandlerThread這個類來創建這個Looper了。查看全部
-
主線程創建handler 重寫handlerMessage 不能做耗時操作喲, 會界面卡死查看全部
-
Handler是什么查看全部
-
1.子線程通過 HandlerThread的thread.getLooper()綁定, 2.在主線程的handler的handlerMessage中調用threadHandler.sendMessageDelay(msg,1000);向子線程發送消息。 3.在子線程中通過handler.sendMessageDelay(msg,1000);向主線程發送消息 4.在一個啟動點btn調用主線程的handler.sendEmptyMessage(int x); 5.在一個結束點btn調用handler.removeMessages(x);查看全部
舉報
0/150
提交
取消