0

onReceiveメソッドでバンドルからいくつかの情報を取得するBroadcastReceiverをUIスレッドに登録しています。メインスレッドに進む前に、これらの値が必要です。

これらの値を使用する前に、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;
}
4

2 に答える 2

2

あなたは物事を複雑にしすぎているようです。サンプルコードに基づいて実際に何を求めているのかを知るのは難しいですが、後に続くコードはregisterReceiver()、ブロードキャストが受信されるのを待ったり期待したりせずに、必要なことをすべて実行してから戻る必要があります。 onReceive()その時点で実行したいコードをすべて含める必要があります(これは、メソッド呼び出しである可能性がありますupdateA("bye")

于 2012-07-11T22:04:20.933 に答える
0

さて、どちらかの方法でメインスレッドをブロックする場合は、エレガントにブロックすることもできます。レシーバーをに登録し、ダイアログAsyncTaskを使用して、ユーザーに何をしているか、または何かをロードしていることを知らせます。

于 2012-07-11T22:04:01.757 に答える