MicroKibaco / CrazyDailyQuestion

每日一问: 水滴石穿,聚沙成塔,坚持数月, 必有收获~
35 stars 1 forks source link

2019-10-31: handler 十二问 - handler 没搞懂你拿什么去跳槽? #57

Open MicroKibaco opened 5 years ago

MicroKibaco commented 5 years ago
  1. handler 是如何实现线程切换的?

  2. handlerpostDelay 是一种什么样的状态?

  3. 如何对 sendMsg 进行拦截?

  4. 一个线程中能有几个handler?如何保证唯一?

  5. 主线程的Looper 与子线程的Looper 有什么区别?

  6. Looper 为什么不会阻塞线程?

  7. handler 的 管道机制 , 为什么不用Binder?

  8. android 系统是调用 nativePollOnce 如何实现阻塞,调用 nativeWake 如何实现唤醒?

  9. handler 听说过 handler 中的 IdleHandler 吗?

  10. handler 有个同步屏障机制,你了解多少呢?

  11. 在Activity 的 onResume 方法中 handler.postRunnable 能获取到 View 宽高吗?

  12. 说说你对 handler 与生产者消费者的理解?

peiniwan commented 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.可以

MicroKibaco commented 5 years ago

Handler的智慧,从终极问题出发

shortybin commented 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.可以

第三个问题我认为可以重写 Handle 的 sendMessageAtTime() 方法,因为所有的发送消息接口最终都执行了此方法,可以在这个方法中去拦截或直接返回状态