每天一道Android面试题

Handler dispatchMessage逻辑分析

2020-02-24  本文已影响0人  那个阳光下奔跑的少年
/**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
           handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

如果Message存在callback,会调用Message callback,我们下面看一下 Message callback是在哪里传进来的,我们看一下Handler post方法

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

在接着看一下getPostMessage(r)

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

这里面会给Message callback赋值。
如果Message没有callback,会走到else,首先会判断Handler.Callback是否为空,不为空,且Handler.Callback handMessage方法返回值为true,则不会执行handler handMessage方法,若返回为false,会执行Handler handleMessage方法

handler = new Handler(Looper.getMainLooper(),callback){
            @Override
            public void handleMessage(@NonNull Message msg) {
                Log.e("MainActivity", "Handler handleMessage");
                super.handleMessage(msg);
            }
        };
        Message msg = new Message();
        msg.what=1;
        handler.sendMessage(msg);

Handler.Callback callback = new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {
            Log.e("MainActivity", "callback handleMessage");
            return true;//返回为true,不会执行Handler handleMessage方法,返回为false会执行
        }
    };
上一篇下一篇

猜你喜欢

热点阅读