2013-12-20 117 views
0

我想了解如何在Android上運行BroadcastReceivers。 我的問題是,在我撥打sendBroadcastLocalBroadcastManager到我的BroadcastReceiver收到時間之間會有延遲嗎?該呼叫是否同步?LocalBroadcastManager執行順序

例如,當調用myFunction時,將輸出爲2112

myFunction { 
    sendBroadcast; 
    print "1"; 
} 

myReceiver { 
    print "2"; 
} 

如果是函數運行改爲

myFunction { 
    sendBroadcast1; 
    print "1"; 
    sendBroadcast2; 
    callALotOfOtherFunctions; 
} 

myReceiver1 { 
    print "2"; 
} 

myReceiver2 { 
    print "3"; 
} 

將全部從myFunction叫其它功能的接收器之前被調用?

+0

爲什麼你不試試看看。 – Kuffs

+0

如果我嘗試它,我會爲我所嘗試的答案得到答案。我正在尋找一個解釋,說明它是如何工作的,而不是在某些特定的場合會有什麼結果 – BarbM

回答

1

意圖正在一個接一個地發送,就像消息隊列上的任何事件一樣。

沒有任何延遲,只能等待您的事件/意圖被照顧,因爲可能會有其他事件/意圖首先被處理。

它們都在UI線程上調用,它在所有事件(和意圖)上循環,因此它被稱爲主循環線程。

+0

在理想的環境中,隊列中沒有其他意圖。有什麼優先?處理事件/意圖或繼續執行代碼?主循環線程聽起來像一個工作線程給我,但是這種情況? – BarbM

+0

它就像一個隊列。你添加了更多的項目,並且只有當你完成了當前的函數調用(你的案例中的「myFunction」),收集到的意圖纔會一個接一個地處理,這意味着訂單將是「myFunction」,無論誰監聽「sendBroadcast1」,然後監聽「sendBroadcast2」。這與任何其他事件完全相同。例如onClickEvent - 如果您調試了應用程序並使其停止在某個功能上,然後在按鈕上多次點擊,事件就會被收集起來,當您釋放調試時,所有事件都將被逐個處理。 –

+0

hmm ok,所以你基本上說在第二個例子中,它會打印1,並且在myFunction的所有其他執行完成後,它將打印出23個。我將測試該場景,並希望我會從更多人獲得更多反饋,如果是這種情況,我會提高你的答案。 – BarbM

0

我相信廣播接收器工作在異步模式,所以(我不知道)是你的功能可以完成你的任務的接收器之前運行,

,你應該試試這個,看看結果你的自我

myFunction { 
    sendBroadcast1; 
    print "1"; 
    sendBroadcast2; 
    callALotOfOtherFunctions; 
} 

myReceiver1 { 
    print("rec1 begins") 
    sleep(1000) 
    print("rec1 ends") 
} 

myReceiver2 { 
    print("rec2 begins") 
    sleep(1000) 
    print("rec2 ends") 
} 

看看您的功能是否在打印之前調用

+0

我不認爲它是異步的,因爲它在文檔中指定,它們在UI線程中調用,除非使用處理程序..and這就是讓我困惑的地方,如果它們不是異步的,它們是如何處理的。 – BarbM

+0

嗯,所以可能你可以嘗試一個例子,並保持我們的發佈 –