-
更新ui查看全部
-
1、使用Handler在子線程中向ui線程發送一個消息進行UI的更新; 2、創建一個Message; Message msg = new Message(); msg.arg1=88; 3、handler.sendMessage(msg); msg.obj=xxx; 可以傳遞一個對象; 4、復用系統的message對象 Message msg = handler.obtainMessage(); msg.sendtoTarget(); 也可以發送到Handler對對象進行處理 handler.removeCallbacks(Runnable r); 可以在handler(Callback的接口中進行截獲);注意:callback接口中handleMessage(Message msg)中若截獲則一定返回true;查看全部
-
handler的callback接口。在handlerMessage方法中返回值為true時,消息被攔截,不執行handler中的handlerMessage方法查看全部
-
handler.removeCallBacks(runnable);移除線程查看全部
-
message.sendTotarget(); 發送消息到handler自身查看全部
-
復用系統對象:Message msg = handler.obtainMessage();查看全部
-
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才可能會收到消息。查看全部
-
1.handler是android給我們提供用來更新UI的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它處理消息; 2.為什么要用handler,是因為android在設計的時候,就封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制就沒有辦法更新UI信息,就會拋出異常信息;查看全部
-
更新UI的4種方式 1.通過Handler的post()方法 mHandler.postDelayed(new Runnable() { public void run() { mTextView.setText("handler.post(Runnable)"); } }, 2000); 2.調用Handler.sendMessage()傳統的方法 Message msg = new Message(); mHandler.sendMessageDelayed(msg, 2000); 配合handleMessage()使用。 3.重寫Activity中的runOnUiThread()方法更新 runOnUiThread(new Runnable() { public void run() { mTextView.setText("runOnUiThread"); } }); 4.調用View自身的post(Runnable run)方法更新; mTextView.postDelayed(new Runnable() { public void run() { mTextView.setText("TextView.post()"); } }, 2000); 總結. 以上四種更新UI的方式歸根結底都是通過sendMessage()實現的。查看全部
-
子線程與主線程之間的相互通信 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);查看全部
-
HandlerThread 1. Handler在創建的時候可以指定Looper,這樣通過Handler的sendMessage()方法發送出去的消息就會添加到指定Looper里面的MessageQueue里面去。在不指定Looper的情況下,Handler綁定的是創建它的線程的Looper。 如果這個線程的Looper不存在,程序將拋出"Can't create handler inside thread that has not called Looper.prepare()"。 2. HandlerThread繼承于Thread,所以它本質就是個Thread。與普通Thread的差別就在于,它有個Looper成員變量。 在其run()方法中,調用Looper.myLooper()獲得一個looper對象。 synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); 在創建handler時使用getLooper()方法,其實現其實是一直等待looper對象的獲得。 while (isAlive() && mLooper == null) { try { wait(); } } 3. HandlerThread的用處 創建Handler的時指定的looper,可以是別的線程創建的。所以Handler中MessageQueue的輪詢不一定非要是創建Handler的線程進行,還可以在別的線程中進行。 這個時候我們就需要使用HandlerThread這個類來創建這個Looper了,這樣消息的處理就在新創建的HandlerThread中進行。(如圖) mThread = new HandlerThread("Handler Thread"); mHandler = new Handler(mThread.getLooper()){ public void handleMessage(android.os.Message msg) { ... }; };查看全部
-
創建一個與線程相關的Handler: 1. 在線程中通過Looper.prepare()方法創建一個與線程相關的Looper對象; 2. 在線程中通過Handler的new關鍵字,創建一個Handler對象,這個對象在創建的時候會關聯上1中創建的Looper對象 3. 調用Looper對象的loop()方法去輪詢它的MessageQueue 4. 通過其他的線程拿到這個線程的Handler對象之后調用sendMessage()之后,在這個線程中就可以進行Message的處理了。 我們一般是在主線程中創建Handler對象,在主線程中處理Message,在子線程中調用這個Handler對象的sendMessage()來發送message。所以Handler是在哪個線程創建就有哪個線程處理Message和輪詢,而由別的線程負責給這個Handler發送Message。查看全部
-
7. Message:消息,其中包含了消息ID,消息處理對象以及處理的數據等,由MessageQueue統一列隊,終由Handler處理。 Handler:處理者,負責Message的發送及處理。使用Handler時,需要實現handleMessage(Message msg)方法來對特定的Message進行處理,例如更新UI等。 MessageQueue:消息隊列,用來存放Handler發送過來的消息,并按照FIFO規則執行。當然,存放Message并非實際意義的保存,而是將Message以鏈表的方式串聯起來的,等待Looper的抽取。 Looper:消息泵,不斷地從MessageQueue中抽取Message執行。因此,一個MessageQueue需要一個Looper。 Thread:線程,負責調度整個消息循環,即消息循環的執行場所。 一下兩篇文章講的非常詳細: http://www.cnblogs.com/xirihanlin/archive/2011/04/11/2012746.html http://blog.csdn.net/mylzc/article/details/6736988 8. 圖解(如圖) 領導就是looper,我(handler)調用sendMessage()發送消息先經過他,他收到message之后調用Looper.loop()方法就將message又返回給我。我來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. MessageQueue 一個消息隊列,可以添加消息,并處理消息 5. Handler 內部會和Looper進行關聯,也就是說在Handler內部可以找到Looper,找到了Looper也就找到了MessageQueue。調用handler.sendMessage()就是向消息隊列中發送消息;然后Looper輪詢MessageQueue,將message發送給Handler本身進行處理。 6. 總結: handler負責發送消息,Looper負責接收Hnandler發送的消息,并直接把消息回傳給hanlder自己。MessageQueue是一個存儲消息的容器。查看全部
-
handler 1.handler是android給我們提供用來更新UI的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它處理消息; 2.為什么要用handler,是因為android在設計的時候,就封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制就沒有辦法更新UI信息,就會拋出異常信息;查看全部
舉報
0/150
提交
取消