创建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);













网友评论