2016-09-08 13 views
1

現在、インテントを外部アプリケーションに送信し、 "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、ビジー待機、カウントダウンラッチ、別のスレッドなど)、このインテントを待つさまざまな方法を試しましたが、私は一貫して同じ問題を抱えています。

答えて

0

sendOrderedBroadcast()にコールすると、ブロードキャストは即座に実行されず、呼び出しを行った同じスレッドによって実行されません。ブロードキャストIntentはアンドロイドフレームワークによって送信されます。基本的には、非同期呼び出しを行い、Androidフレームワークに注文されたブロードキャストを送信するよう依頼しています。フレームワークは、制御を戻すまではブロードキャストを送信できません(つまり、メソッドからreturn)。フレームワークに制御権を戻さず、すぐにブロックします。

また、どのような状況でも、メイン(UI)スレッドを確実にブロックすることはできません。あなたはcond.block()と呼ぶ場所を指定していませんが、これはバックグラウンドスレッドであり、メインスレッドではない方がよいでしょう。とにかく何もブロックしてはいけません。あなたは何もしないで、コールバック(または何でも)を待って、コールバックが来たら処理を続けるべきです。

+0

開始するには、これがUIスレッドによって行われていないことを明確にしたいと思います。プログラム全体がバックグラウンドで実行されているサービスです。 私は応答を理解していることを確認するために、私はsendOrderedBroadcastを自分の別の方法で呼び出す必要がありますが、問題を解決できるはずです。私が包み込みの方法で応答を待っている限り、ちょうどそうですか? 私はこれらの手順に従おうとしたので質問します。私はまだ問題を定期的に再現できて、何かを逃したかどうかを知りたいと思います。 – gebhartc

+0

"バックグラウンドで実行中のサービス"とはどういう意味ですか? 'Service'でバックグラウンドスレッドを開始しますか? 'Service'は、デフォルトでバックグラウンドで実行されません。第二にあなたは誤解しました。同じ方法で応答を待つことはできません。あなたは方法から戻る必要があります。放送はある時後に来るでしょう。 –

+0

また、 'responseReceiver'の' onReceive() 'がメイン(UI)スレッドで呼び出されることに注意してください。 –

関連する問題