Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用程序的消息處理機制學習心得(一)

Android應用程序的消息處理機制學習心得(一)

編輯:關於Android編程

InputManager類處理過程:

InputManager 先創建InputDispatcher 和InputReader對象,並把InputReader和InputDispatcher對象為參數再創建兩個線程對象,InputReaderThread 以及InputDispatcherThread。InputManager::start()啟動兩個線程。

InputReader類處理過程:

InputReader::loopOnce()--->EventHub::getEvents()--->InputReader::processEventsLocked()---

--->InputReader::processEventsForDeviceLocked()--->InputDevice::process()--->TouchInputMapper::process()--

--->TouchInputMapper::sync()--->TouchInputMapper::dispatchTouches()

EventHub類處理過程:

getEvents()函數負責處理事件,可以處理不止一個事件,這個之前版本源碼不同,scanDirLock()負責掃描設備,openDeviceLock()負責生成設備相關信息,新版函數都在後面加了Lock。


讀過一些源碼之後,我思考了兩個問題

1.有些文章說InputReaderThread 和InputDispatcherThread都會在沒有事件時進入睡眠狀態。研讀源碼發現InputDispatcher::dispatchOnce()以及mLooper->pollOnce()確實在沒有事件需要處理時進行睡眠,但研讀InputRedaer源碼時,沒有了解其如何睡眠。

2.InputReader是如何和InputDispatcher交互的?因為老版本源碼,InputReader有getDispatcher()函數,但新版本替換為getListener()。


繼續研讀代碼發現答案:

1.InputReaderThread::loopOnce會休眠到EventHub::getEvents()中的epoll_wait(),epoll_wait()是系統調用,負責輪詢IO的。

2.getListener()是一個隊列 ,隊列裡面是一個Inputdispatcher對象。

明天繼續研讀,寫寫筆記免得自己忘掉。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved