日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

android項目實例源碼 android源碼怎么運行( 二 )



?

android項目實例源碼 android源碼怎么運行


消息發(fā)送
?

android項目實例源碼 android源碼怎么運行



android項目實例源碼 android源碼怎么運行


消息處理

android項目實例源碼 android源碼怎么運行



android項目實例源碼 android源碼怎么運行


?
?
消息阻塞和延時
Looper 的阻塞主要是靠 MessageQueue 來實現(xiàn)的,在next()@MessageQuese 進行阻塞,在 enqueueMessage()@MessageQueue 進行喚醒 。主要依賴 native 層的 Looper 依靠 epoll 機制進行的 。
Message next() {int pendingIdleHandlerCount = -1; // -1 only during first iterationint nextPollTimeoutMillis = 0;for (;;) {if (nextPollTimeoutMillis != 0) {Binder.flushPendingCommands();}//阻塞和延時,主要是next()中nativePollOnce(ptr, nextPollTimeoutMillis)調(diào)用naive方法操作管道nativePollOnce(ptr, nextPollTimeoutMillis);} }
android項目實例源碼 android源碼怎么運行


阻塞和延時,主要是next()中nativePollOnce(ptr, nextPollTimeoutMillis)調(diào)用naive方法操作管道,由nextPollTimeoutMillis決定是否需要阻塞nextPollTimeoutMillis為0的時候表示不阻塞,為-1的時候表示一直阻塞直到被喚醒,其他時間表示延時 。
喚醒
主要是指enqueueMessage()@MessageQueue 進行喚醒 。
boolean enqueueMessage(Message msg, long when) {//在這里喚醒阻塞的方法if (needWake) {nativeWake(mPtr);}}
android項目實例源碼 android源碼怎么運行


簡單理解阻塞和喚醒 就是在主線程的MessageQueue沒有消息時,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此時主線程會釋放CPU資源進入休眠狀態(tài),直到下個消息到達或者有事務發(fā)生,通過往pipe管道寫端寫入數(shù)據(jù)來喚醒主線程工作 。這里采用的epoll機制,是一種IO多路復用機制,可以同時監(jiān)控多個描述符,當某個描述符就緒(讀或?qū)懢途w),則立刻通知相應程序進行讀或?qū)懖僮?,本質(zhì)同步I/O,即讀寫是阻塞的 。所以說,主線程大多數(shù)時候都是處于休眠狀態(tài),并不會消耗大量CPU資源 。從阻塞到喚醒,消息切換

android項目實例源碼 android源碼怎么運行


?
延時入隊

android項目實例源碼 android源碼怎么運行


?
主要指enqueueMessage()消息入列是,上圖代碼對message對象池的重新排序,遵循規(guī)則(when從小到大) 。此處for死循環(huán)退出情況分兩種 第一種:p==null表示對象池中已經(jīng)運行到了最后一個,無需再循環(huán) 。第二種:碰到下一個消息when小于前一個,立馬推出循環(huán)(不管對象池中所有message是否遍歷完),進行重新排序 。

推薦閱讀