現在、インテントを外部アプリケーションに送信し、 "sendOrderedBroadcast()"と条件変数を使用して応答を待つコードを記述しています。これを実行している間、私は外部のアプリケーションからの応答を待つ間に、意図が送信されるのをブロックすることができます。スレッドはインテントを待ってインテントを送信することをブロックします
私のコードは次のようになります。
final ConditionVariable cond = new ConditionVariable();
BroadcastReceiver responseReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
//set data values here
cond.open();
}
};
sendOrderedBroadcast(intent, null, responseReceiver , null, 0, null, null);
cond.block(TIMEOUT);
シナリオは、アプリケーションが毎秒2〜3回の割合で、コードのこのセクションを起動したときsendOrderedBroadcastが実際に前に意図を送信しないことですブロック()メソッドが呼び出されます(少なくともこれは現在の私の理論です)。これは、タイムアウトが完了するまで、受信アプリケーションによってインテントが受信されないことを意味します。
これを回避する簡単な方法はありますか?私は返される(Sleeping、ビジー待機、カウントダウンラッチ、別のスレッドなど)、このインテントを待つさまざまな方法を試しましたが、私は一貫して同じ問題を抱えています。
開始するには、これがUIスレッドによって行われていないことを明確にしたいと思います。プログラム全体がバックグラウンドで実行されているサービスです。 私は応答を理解していることを確認するために、私はsendOrderedBroadcastを自分の別の方法で呼び出す必要がありますが、問題を解決できるはずです。私が包み込みの方法で応答を待っている限り、ちょうどそうですか? 私はこれらの手順に従おうとしたので質問します。私はまだ問題を定期的に再現できて、何かを逃したかどうかを知りたいと思います。 – gebhartc
"バックグラウンドで実行中のサービス"とはどういう意味ですか? 'Service'でバックグラウンドスレッドを開始しますか? 'Service'は、デフォルトでバックグラウンドで実行されません。第二にあなたは誤解しました。同じ方法で応答を待つことはできません。あなたは方法から戻る必要があります。放送はある時後に来るでしょう。 –
また、 'responseReceiver'の' onReceive() 'がメイン(UI)スレッドで呼び出されることに注意してください。 –