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(),可是另外两个先出结果了。队列

相关文章
相关标签/搜索