美文网首页Android Framework
Android Handler消息机制

Android Handler消息机制

作者: xiabodan | 来源:发表于2019-10-24 15:06 被阅读0次

创建Handler时有3种方式

消息分发的优先级:

Message的回调方法:message.callback.run(),优先级最高;
Handler的回调方法:Handler.mCallback.handleMessage(msg),优先级仅次于1;
Handler的默认方法:Handler.handleMessage(msg),优先级最低。

1、Handler的post方法

通过Handler的post(Runnable r)的,本质是拿message时传入了Runnable,执行的是message.callback.run()

public class TestRunnable implements Runnable {
    public boolean wasRun = false;

    @Override public void run() {
        wasRun = true;
    }
}
TestRunnable scratchRunnable = new TestRunnable();
@Test
public void testPost() throws Exception {
    new Handler().post(scratchRunnable);
}

2、传入Callback

执行的是Handler的回调方法Handler.mCallback.handleMessage(msg)

    private Handler.Callback callback = new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            hasHandlerCallbackHandledMessage = true;
            return false;
        }
    };
        
    @Test
    public void shouldCallProvidedHandlerCallback() {
        Handler handler = new Handler(callback);
        handler.sendMessage(new Message());
        assertTrue(hasHandlerCallbackHandledMessage);
    }

3、直接new Handler

执行的是Handler的回调方法Handler.handleMessage(msg)

    @Test
    public void removeMessages_removesFromLooperQueueAsWell() {
        final boolean[] wasRun = new boolean[1];
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                wasRun[0] = true;
            }
        };
        handler.sendEmptyMessageDelayed(123, 500);
    }

Handler消息分发机制

messageQueue是在Looper.java中创建的

  • 消息空等待是Looper.java中的loop()-->MessageQueue中的next()-->native Looper中的 pollInner中挂起(epoll_wait)
  • 消息的添加enqueueMessage(Message msg, long when),加在MessageQueue中的mMessages(一个链表)队尾上,并唤醒native looper (wake)
  • 消息的响应是wake(写mWakeEventFd,mWakeEventFd是专门用于消息的fd),或者有其他addFd过的fd有事件时(见BitTube),之后会Looper中的loop(),会继续执行msg.target.dispatchMessage(msg);

相关文章

网友评论

    本文标题:Android Handler消息机制

    本文链接:https://www.haomeiwen.com/subject/oretbxtx.html