您当前的位置: 首页 >  面试
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试:handler.post和handler.sendMessage的区别和联系

沙漠一只雕得儿得儿 发布时间:2021-12-23 16:00:20 ,浏览量:0

先通过源码来看下这两个方法的区别:

/**
     * Causes the Runnable r to be added to the message queue.
     * 这里源码注释的意思是:把r这个任务对象添加到消息队列中。
     */
    public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }

/**
     * Enqueue a message into the message queue after all pending messages
*然后我们接着看post方法中直接调用到的发送延时消息的方法,源码注释*的意思是把这个消息放入消息队列,
     */
    public final boolean sendMessageDelayed(Message msg, long delayMillis)
    {
        if (delayMillis < 0) {
            delayMillis = 0;
        }
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }

/*最后我们再看post中调用的另外一个方法,源码中没有注释,但我们很容易看出来,这个方法就是把r这个任务包装成了一个空的消息并且返回*/
private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
}

至此,我们可以得出结论: handler.post和handler.sendMessage本质上是没有区别的,都是发送一个消息到消息队列中,而且消息队列和handler都是依赖于同一个线程的。

接下来我们再结合实际应用中的例子来分析: 分别用sendMessage和post完成同样的异步更新UI的任务:

private TextView tv_up;
    private String new_str = "";
    /*post方法解决UI更新问题handler创建方式*/
    private Handler handler_post = new Handler();
    /*sendMessage方法解决UI更新问题handler创建方式*/
    Handler handler_senM = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                /*sendMessage方法更新UI的操作必须在handler的handleMessage回调中完成*/
                tv_up.setText(new_str);
            }
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {

            @Override
            public void run() {
                new_str = "更新UI";
                /*sendMessage方法解决UI更新发送消息给handler(主线程中的handler)*/
                handler_senM.sendEmptyMessage(1);
                /*post方法解决UI更新,直接在runnable里面完成更新操作,这个任务会被添加到handler所在线程的消息队列中,即主线程的消息队列中*/
                handler_post.post(new Runnable() {

                    @Override
                    public void run() {
                        tv_up.setText(new_str);
                    }
                });
            }
        }).start();
    }

从这段代码中我们可以看出: post和sendMessage只是用法上的区别,本质是没有区别的。

最终总结: 1. post和sendMessage本质上是没有区别的,只是实际用法中有一点差别 2. post也没有独特的作用,post本质上还是用sendMessage实现的,post只是一中更方便的用法而已。

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0369s