Handler post() 方法和 sendMessage()方法的區(qū)別

在使用handler 的時(shí)候注意到除了sendMessage()的幾個(gè)方法,還有post() 和postDelayed()。那么post 和send 有啥區(qū)別呢?

網(wǎng)上搜了一下,發(fā)現(xiàn)很多說(shuō)handler.post(runnable) 開(kāi)啟了新的線程執(zhí)行任務(wù),或者說(shuō)post(runnable)是異步執(zhí)行。

注意: 錯(cuò)的 !這都是錯(cuò)的??!post() 即沒(méi)有開(kāi)啟新的線程,也不是異步操作?。?!

代碼來(lái)驗(yàn)證一下

@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();
                    }
                }
            }
        });

    }

主線程里注冊(cè)了一個(gè)點(diǎn)擊事件,handler post一個(gè)runnable ,runnable里是耗時(shí)任務(wù),運(yùn)行代碼 Log.d("run", "name =" + Thread.currentThread().getName());打印的是main 。點(diǎn)擊按鈕Log.d("onClick", "444444");沒(méi)有打印,幾秒后彈出無(wú)響應(yīng)

說(shuō)明了runnable 還是在main線程里執(zhí)行,runnable 里的耗時(shí)任務(wù)會(huì)阻塞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);
    }

發(fā)現(xiàn)跟sendMessage()一樣 都調(diào)用了sendMessageDelayed()這個(gè)方法,getPostMessage()
把runnable 打包成message 最終還是發(fā)送的message

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

再去看一下message 分發(fā)的代碼

    /**
     * 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不為空,就執(zhí)行handleCallback(),handleCallback()里就一行代碼,執(zhí)行run()方法。這全程沒(méi)有一丁點(diǎn)異步的東西。所以網(wǎng)上看資料要謹(jǐn)慎呢!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容