定義好handler後,在其餘線程訪問這個線程的handler,調用sendMessage()發送信息給主線程的handler。內部是經過消息隊列的方式依次傳遞。ide
在定義本身的Handler的時候都會重寫Handler的handleMessage()方法來對拿到的消息進行處理,所以這個方法應該是運行在接收消息的線程的。(例以下載內容->更新UI,handleMessage()運行在主線程)。 很無奈的是這個方法在父類Handler中就是一個public的方法,所以若是不當心在該寫sendMessage()的地方寫了handleMessage(),就會形成handleMessage()中寫的內容運行在子線程中,而後使用了致使修改UI失敗等錯誤。 (相似於新建了一個線程,而後調用run方法去執行它的Runnable了,而沒有執行start開闢新線程)spa
dispatchMessage的調用和handleMessage狀況相似,內部實際上仍是調用handleMessage(),所以,直接調用也是沒法回到主線程的。線程
Thread t1= new Thread(new Runnable() { @Override public void run() { handler.handleMessage(Message.obtain()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendMessage(Message.obtain()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } handler.dispatchMessage(Message.obtain()); } }); t1.setName("子線程"); t1.start();
@Override public void handleMessage(@NonNull Message msg) { Log.d(TAG, "handleMessage: handler裏的線程:"+Thread.currentThread().toString()); }
運行能夠看到結果以下: handleMessage: handler裏的線程:Thread[子線程,5,main] handleMessage: handler裏的線程:Thread[main,5,main] handleMessage: handler裏的線程:Thread[子線程,5,main] 證實只有sendMessage()纔可讓消息正確傳達到主線程。code
【爲啥要在發消息之間暫停一秒呢?】 由於handleMessage和dispatchMessage不牽涉到線程間的通訊,速度要比sendMessage快,若是不加,那麼運行結果就有可能變成——我先調用了sendMessage(),可是另外兩個先出結果了。隊列