2019-10-31: handler 十二问 - handler 没搞懂你拿什么去跳槽?
-
handler是如何实现线程切换的? -
handler的postDelay是一种什么样的状态? -
如何对 sendMsg 进行拦截?
-
一个线程中能有几个
handler?如何保证唯一? -
主线程的
Looper与子线程的Looper有什么区别? -
Looper为什么不会阻塞线程? -
handler的 管道机制 , 为什么不用Binder? -
android系统是调用nativePollOnce如何实现阻塞,调用nativeWake如何实现唤醒? -
handler听说过handler中的IdleHandler吗? -
handler有个同步屏障机制,你了解多少呢? -
在Activity 的 onResume 方法中 handler.postRunnable 能获取到 View 宽高吗?
-
说说你对
handler与生产者消费者的理解?
4.一个线程可以有多个 Handler,因为 Handler 的引用被Message 持有的,msg.tagre(也就是Handler).dispatchMessage方法分发消息 5.主线程创建时传入的 quitAllowed 是 false。而子线程是paper(true),MessageQueue的quit()方法能否退出。
void quit(boolean safe) {
if (!mQuitAllowed) {
throw new IllegalStateException("Main thread not allowed to quit.");
}
synchronized (this) {
if (mQuitting) {
return;
}
mQuitting = true;
if (safe) {
removeAllFutureMessagesLocked();
} else {
removeAllMessagesLocked();
}
// We can assume mPtr != 0 because mQuitting was previously false.
nativeWake(mPtr);
}
}
6.在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。 9.IdleHandler 可以用来提升性能,主要用在我们希望能够在当前线程消息队列空闲时做些事情(譬如 UI 线程在显示完成后,如果线程空闲我们就可以提前准备其他内容)的情况下,不过最好不要做耗时操作。 11.可以
4.一个线程可以有多个 Handler,因为 Handler 的引用被Message 持有的,msg.tagre(也就是Handler).dispatchMessage方法分发消息 5.主线程创建时传入的 quitAllowed 是 false。而子线程是paper(true),MessageQueue的quit()方法能否退出。
void quit(boolean safe) { if (!mQuitAllowed) { throw new IllegalStateException("Main thread not allowed to quit."); } synchronized (this) { if (mQuitting) { return; } mQuitting = true; if (safe) { removeAllFutureMessagesLocked(); } else { removeAllMessagesLocked(); } // We can assume mPtr != 0 because mQuitting was previously false. nativeWake(mPtr); } }6.在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。 9.IdleHandler 可以用来提升性能,主要用在我们希望能够在当前线程消息队列空闲时做些事情(譬如 UI 线程在显示完成后,如果线程空闲我们就可以提前准备其他内容)的情况下,不过最好不要做耗时操作。 11.可以
第三个问题我认为可以重写 Handle 的 sendMessageAtTime() 方法,因为所有的发送消息接口最终都执行了此方法,可以在这个方法中去拦截或直接返回状态