Handler post() 方法和 sendMessage()方法的区别

在使用handler 的时候注意到除了sendMessage()的几个方法,还有post() 和postDelayed()。那么post 和send 有啥区别呢?

网上搜了一下,发现很多说handler.post(runnable) 开启了新的线程执行任务,或者说post(runnable)是异步执行。

注意: 错的 !这都是错的!!post() 即没有开启新的线程,也不是异步操作!!!

代码来验证一下

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.buttonA).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("onClick", "444444");
            }
        });

        Handler handler1 = new Handler();
        handler1.post(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    Log.d("run", "name =" + Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }

主线程里注册了一个点击事件,handler post一个runnable ,runnable里是耗时任务,运行代码 Log.d("run", "name =" + Thread.currentThread().getName());打印的是main 。点击按钮Log.d("onClick", "444444");没有打印,几秒后弹出无响应

说明了runnable 还是在main线程里执行,runnable 里的耗时任务会阻塞main线程。

看下post的源码

    public final boolean post(@NonNull Runnable r) {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }

    public final boolean sendMessage(@NonNull Message msg) {
        return sendMessageDelayed(msg, 0);
    }

发现跟sendMessage()一样 都调用了sendMessageDelayed()这个方法,getPostMessage()
把runnable 打包成message 最终还是发送的message

    private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }

再去看一下message 分发的代码

    /**
     * Handle system messages here.
     */
    public void dispatchMessage(@NonNull Message msg) {
       //msg.callback 就是post的runnable
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }


    private static void handleCallback(Message message) {
        message.callback.run();
    }

如果message.callback不为空,就执行handleCallback(),handleCallback()里就一行代码,执行run()方法。这全程没有一丁点异步的东西。所以网上看资料要谨慎呢!!

你可能感兴趣的:(Handler post() 方法和 sendMessage()方法的区别)