成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析(7)

移動(dòng)開(kāi)發(fā) Android
這里說(shuō)的等待,是空閑等待,而不是忙等待,因此,在進(jìn)入空閑等待狀態(tài)前,如果應(yīng)用程序注冊(cè)了IdleHandler接口來(lái)處理一些事情,那么就會(huì)先執(zhí) 行這里IdleHandler,然后再進(jìn)入等待狀態(tài)。

如果消息隊(duì)列中有消息,并且當(dāng)前時(shí)候大于等于消息中的執(zhí)行時(shí)間,那么就直接返回這個(gè)消息給Looper.loop消息處理,否則的話就要等待到消息的執(zhí)行時(shí)間:

[java] view plaincopynextPollTimeoutMillis = (int) Math.min(when - now, Integer.MAX_VALUE);

如果消息隊(duì)列中沒(méi)有消息,那就要進(jìn)入無(wú)窮等待狀態(tài)直到有新消息了:

[java] view plaincopynextPollTimeoutMillis = -1;

-1表示下次調(diào)用nativePollOnce時(shí),如果消息中沒(méi)有消息,就進(jìn)入無(wú)限等待狀態(tài)中去。

當(dāng)前nativePollOnce返回后,就去看看消息隊(duì)列中有沒(méi)有消息:

  1. [java] view plaincopyfinal Message msg = mMessages; 
  2. if (msg != null) { 
  3. final long when = msg.when; 
  4. if (now >= when) { 
  5. mBlocked = false
  6. mMessages = msg.next; 
  7. msg.next = null
  8. if (Config.LOGV) Log.v("MessageQueue""Returning message: " + msg); 
  9. return msg; 
  10. else { 
  11. nextPollTimeoutMillis = (int) Math.min(when - now, Integer.MAX_VALUE); 
  12. else { 
  13. nextPollTimeoutMillis = -1
  14. }

這里計(jì)算出來(lái)的等待時(shí)間都是在下次調(diào)用nativePollOnce時(shí)使用的。

這里說(shuō)的等待,是空閑等待,而不是忙等待,因此,在進(jìn)入空閑等待狀態(tài)前,如果應(yīng)用程序注冊(cè)了IdleHandler接口來(lái)處理一些事情,那么就會(huì)先執(zhí) 行這里IdleHandler,然后再進(jìn)入等待狀態(tài)。IdlerHandler是定義在MessageQueue的一個(gè)內(nèi)部類(lèi):

  1. [java] view plaincopypublic class MessageQueue { 
  2. ...... 
  3. /** 
  4. * Callback interface for discovering when a thread is going to block 
  5. * waiting for more messages. 
  6. */ 
  7. public static interface IdleHandler { 
  8. /** 
  9. * Called when the message queue has run out of messages and will now 
  10. * wait for more. Return true to keep your idle handler active, false 
  11. * to have it removed. This may be called if there are still messages 
  12. * pending in the queue, but they are all scheduled to be dispatched 
  13. * after the current time. 
  14. */ 
  15. boolean queueIdle(); 
  16. ...... 

它只有一個(gè)成員函數(shù)queueIdle,執(zhí)行這個(gè)函數(shù)時(shí),如果返回值為false,那么就會(huì)從應(yīng)用程序中移除這個(gè)IdleHandler,否則的話就會(huì)在 應(yīng)用程序中繼續(xù)維護(hù)著這個(gè)IdleHandler,下次空閑時(shí)仍會(huì)再執(zhí)會(huì)這個(gè)IdleHandler。MessageQueue提供了 addIdleHandler和removeIdleHandler兩注冊(cè)和刪除IdleHandler。

回到MessageQueue函數(shù)中,它接下來(lái)就是在進(jìn)入等待狀態(tài)前,看看有沒(méi)有IdleHandler是需要執(zhí)行的:

  1.   [java] view plaincopy// If first time, then get the number of idlers to 
  2. run. 
  3.   if (pendingIdleHandlerCount < 0) { 
  4.   pendingIdleHandlerCount = mIdleHandlers.size(); 
  5.   } 
  6.   if (pendingIdleHandlerCount == 0) { 
  7.   // No idle handlers to run. Loop and wait some more. 
  8.   mBlocked = true
  9.   continue
  10.   } 
  11.   if (mPendingIdleHandlers == null) { 
  12.   mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 
  13. 4)]; 
  14.   } 
  15.   mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers); 

如果沒(méi)有,即pendingIdleHandlerCount等于0,那下面的邏輯就不執(zhí)行了,通過(guò)continue語(yǔ)句直接進(jìn)入下一次循環(huán),否則就要把 注冊(cè)在mIdleHandlers中的IdleHandler取出來(lái),放在mPendingIdleHandlers數(shù)組中去。

接下來(lái)就是執(zhí)行這些注冊(cè)了的IdleHanlder了:

  1. [java] view plaincopy// Run the idle handlers. 
  2. // We only ever reach this code block during the first iteration. 
  3. for (int i = 0; i < pendingIdleHandlerCount; i++) { 
  4. final IdleHandler idler = mPendingIdleHandlers[i]; 
  5. mPendingIdleHandlers[i] = null// release the reference to the handler 
  6. boolean keep = false
  7. try { 
  8. keep = idler.queueIdle(); 
  9. catch (Throwable t) { 
  10. Log.wtf("MessageQueue""IdleHandler threw exception", t); 

 

責(zé)任編輯:閆佳明 來(lái)源: bbs.9ria
相關(guān)推薦

2014-05-22 14:57:28

Android消息處理機(jī)制Looper

2014-05-22 15:15:53

Android消息處理機(jī)制Looper

2014-05-22 15:18:25

Android消息處理機(jī)制Looper

2014-05-22 15:45:58

Android消息處理機(jī)制Looper

2014-05-22 15:00:16

Android消息處理機(jī)制Looper

2014-05-22 15:04:00

Android消息處理機(jī)制Looper

2014-05-22 15:07:44

Android消息處理機(jī)制Looper

2014-05-22 15:38:27

Android消息處理機(jī)制Looper

2014-05-22 15:48:50

Android消息處理機(jī)制Looper

2014-05-22 15:41:59

Android消息處理機(jī)制Looper

2011-04-28 11:01:40

Android消息處理LooperHandler

2011-11-23 09:33:45

HandlerLooperMessage

2014-05-27 10:13:57

移動(dòng)技術(shù)半月刊

2016-10-21 13:03:18

androidhandlerlooper

2011-09-05 17:40:40

MTK定時(shí)器

2011-03-17 09:20:05

異常處理機(jī)制

2014-05-27 14:59:24

AndroidActivitysingleTask

2021-08-12 16:28:10

AndroidHandleLooper

2023-03-08 08:54:59

SpringMVCJava

2023-06-15 14:09:00

解析器Servlet容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区四区电影视频在线观看 | 精品久久久久久久久久久 | 国产xxxx在线 | 欧美在线观看一区 | 精品国产一区二区三区久久久四川 | 久久精品小视频 | www精品美女久久久tv | 91精品国产综合久久精品 | 99免费在线观看视频 | 久久精品亚洲 | 夜夜骑天天干 | 精品99在线 | 国产精品欧美一区二区 | 亚洲一区二区精品 | 国产在线精品一区二区三区 | 99福利视频 | 国产三级国产精品 | 国产精品久久久亚洲 | 国产在线高清 | 狠狠操网站 | 国产精品久久久久久久一区二区 | 亚洲国产精品美女 | 一级欧美黄色片 | 久久99视频免费观看 | 一区二区三区高清不卡 | 综合网在线 | 国产91在线 | 亚洲 | 夜夜骚| 在线观看视频一区 | 成人二区| 国产高清视频在线播放 | 天天射影院 | 嫩草视频网 | 免费特黄视频 | 国内精品在线视频 | 日韩一级免费大片 | 国产精品69久久久久水密桃 | 激情小视频 | 天天干天天干 | 久久精品国产99国产精品亚洲 | www.中文字幕av |