0
  • 你有尝试去阅读Handler的源码吗?


    关键点就两个。


    一个是没有消息的时候,会释放资源,不再轮询。


    另外一个是把消息发到队列里的时候,会唤醒轮询。


    这样子,就不阻塞了呀。



    判断是否需要唤醒


    boolean enqueueMessage(Message msg, long when) {
       ...
            if (needWake) {
                nativeWake(mPtr);
            }
            return true;
    }
    



    唤醒:nativeWake(mPtr);


    轮询获取消息的地方


    public static void loop() {
    	...
    	for (;;) {
    		Message msg = queue.next(); // might block
    		...
    	}
    }
    


    再看看队列里的next方法


    这个方法可能会被阻塞


    Message next() {
    		...
    	for (;;) {
    		nativePollOnce(mPtr, nextPollTimeoutMillis);
    		...
    }
    


    到这里,你可以理解为主线程去干其他事情了,当消息进入队列的时候,前面不是有个唤醒嘛。这样子主线程在某个时间片又来轮询了。





    1153952789488054272  评论     打赏       拉大锯
    • 无敌黑小孩  回复 @拉大锯
      大锯哥,”没有消息的时候,会释放资源,不再轮询。”不再轮询,这句话的意思是looper停止循环的意思吗?那主线程如果没了这个循环他不就结束了吗
      无敌黑小孩 2020-12-04 15:48   回复 1295638884390133760
相关问题
_empty · Android
2019-10-20 23:51 628 2
application · Android
2019-11-05 00:26 779 2
三流废物 · android / 小白
2019-11-22 00:35 1067 5
豪豪好嘛 · Android / GPS
2019-11-26 20:15 884 5
Jian · android
2019-11-28 01:51 615 2
2019-12-01 01:01 705 2
小陈学编程 · Android
2019-12-01 19:08 633 2
fkinggod · Android
2019-12-08 09:19 661 5
fkinggod · Android
2019-12-08 20:47 611 2
kissmyass · Android
2019-12-09 07:08 537 2
独一无二的名zi · Android
2019-12-30 06:48 415 2