Android Handler的handleMessage()、sendMessage()、dispatchMessage()的區別

sendMessage()

定義好handler後,在其餘線程訪問這個線程的handler,調用sendMessage()發送信息給主線程的handler。內部是經過消息隊列的方式依次傳遞。ide

handleMessage()

在定義本身的Handler的時候都會重寫Handler的handleMessage()方法來對拿到的消息進行處理,所以這個方法應該是運行在接收消息的線程的。(例以下載內容->更新UI,handleMessage()運行在主線程)。 很無奈的是這個方法在父類Handler中就是一個public的方法,所以若是不當心在該寫sendMessage()的地方寫了handleMessage(),就會形成handleMessage()中寫的內容運行在子線程中,而後使用了致使修改UI失敗等錯誤。 (相似於新建了一個線程,而後調用run方法去執行它的Runnable了,而沒有執行start開闢新線程)spa

dispatchMessage()

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(),可是另外兩個先出結果了。隊列

相關文章
相關標籤/搜索