2012-07-11 79 views
0

我有一個在UI線程中註冊的BroadcastReceiver,它在onReceive方法中從Bundle獲取一些信息。在我進入主線程之前,我需要這些值。如何等待onReceive在同一個線程中完成?

在嘗試使用這些值之前是否有任何方法等待onReceive完成?我遇到了在嘗試使用它們之後onReceive設置值的計時問題。讓線程休眠不起作用,因爲它們在同一個線程中。

將接收器註冊到AsyncTask中,並在主線程中調用wait(),然後在onReceive notify()完成後是否有意義?

String a = "hi"; 
IntentFilter filter = new IntentFilter(); 
filter.addAction(MY_CUSTOM_INTENT); 
BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Set the variable values here 
     a = "bye"; 
    } 
}; 
getApplicationContext().registerReceiver(receiver, filter); 

// Get the values, I am getting a = "hi" here because the onReceive code has 
// not been reached yet 
// How can I guarantee that a = "bye" from this method? 
getA(); 

其中,方法是一樣的東西

String getA() { 
    return a; 
} 
+0

你能說清楚嗎? – pawelzieba 2012-07-11 19:18:15

回答

1

你似乎過於複雜的東西。根據示例代碼,很難知道你真的在做什麼,但registerReceiver()之後的代碼應該只做它需要做的事情然後返回,而不用等待或希望收到廣播。 onReceive()應該包括你想要執行的任何代碼(這可能只是一個方法調用,例如updateA("bye")

+1

基本上,我有其他方法依賴onReceive中設置的值,所以即使我依賴於接收器,將代碼放入onReceive也沒有意義,我希望有一種方法來「等待」,直到接收器設置這些值。 – nicobatu 2012-07-11 22:31:06

+1

@nicobatu您可以將該代碼在'onReceive()'或者'onReceive()'調用的方法中,你可以看到它的工作方式,你不會在UI線程上「等待」,但是你可以設置一個回調函數在時間正確的時候運行你想要的任何代碼如果你仍然遇到麻煩,請發佈一個更完整的代碼示例在你給出的例子中,解決方案是將調用移動到'getA()'內部'的onReceive( )',你就會有你想要的行爲。很明顯,你認爲在你的情況下你無法做到這一點是有原因的,所以發佈更多的代碼。 – 2012-07-11 22:50:48

+1

我正在編寫庫函數,其中getA()的值可能會根據接收器是否啓用(通過用戶選擇)而改變,因此我擔心隨後調用這兩種方法的時間。但是我想我會在這種情況下添加一個新的函數,其中getA()位於onReceive()內部。 – nicobatu 2012-07-11 23:03:20

0

好吧,如果你要阻塞主線程無論哪種方式,還不如做它優雅..註冊與AsyncTask接收器,並使用Dialog讓用戶知道你在做什麼或者你正在加載什麼東西。