Open MicroKibaco opened 5 years ago
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() 方法,因为所有的发送消息接口最终都执行了此方法,可以在这个方法中去拦截或直接返回状态
handler
是如何实现线程切换的?handler
的postDelay
是一种什么样的状态?如何对 sendMsg 进行拦截?
一个线程中能有几个
handler
?如何保证唯一?主线程的
Looper
与子线程的Looper
有什么区别?Looper
为什么不会阻塞线程?handler
的 管道机制 , 为什么不用Binder
?android
系统是调用nativePollOnce
如何实现阻塞,调用nativeWake
如何实现唤醒?handler
听说过handler
中的IdleHandler
吗?handler
有个同步屏障机制,你了解多少呢?在Activity 的 onResume 方法中 handler.postRunnable 能获取到 View 宽高吗?
说说你对
handler
与生产者消费者的理解?