2016-10-01 2 views
0

私はオーディオをストリームするアプリを持っています。別のスレッドでは、サービスを起動して、進行状況ダイアログをユーザーに表示します。 Serviceは、オーディオを開始するか、10秒以内にエラーが発生します。私が今持っているハッキーなやり方は、Serviceがオーディオが準備されているか、エラーが発生していると判断したときに、その情報で私のActivityにローカルブロードキャストメッセージを送り返すことです。これは私の主な活動で、サービスのロードとメディアの準備が完了し、進行状況ダイアログなどを閉じることができます。MainActivity今すぐdo whileループで待機し、変数をチェックしていますそれは、変数と変わるサービスからの放送を受信するまで小さなバックグラウンドタスクを待ってループする最善の方法?

は、私がこれを行うための適切な方法は何か、これはおそらくないので、私の質問はこれを行うための正しい方法であることを知っていますか?ありがとう。

+1

ループを取り除く。 'ProgressDialog'で十分です。放送が受信されたときにそれを単に却下するだけです。 –

答えて

0

この種のビジー待機は、この種の状況を処理するための良い考えではありません。あなたはこのように宣言されたインタフェースを持つことを検討するかもしれません。

public interface MediaResponseListener { 
    void mediaResponseReceiver(String result); 
} 

その後は、このようなあなたのMainActivityinterfaceを実装する必要があります。

public class MainActivity extends Activity implements MediaResponseListener { 
    // Your onCreate and other function goes here 

    // Then you need to implement the function of your interface 
    @Override 
    public void mediaResponseReceiver(String result) { 
     // Do something with the result 
    } 
} 

は今、あなたはあまりにもあなたのServiceクラスでinterfaceを宣言し、あなたのMainActivityからServiceを開始しているときinterfaceの参照を渡します。したがって、Serviceはこのように見えます。

public AudioService extends Service { 

    // Declare an interface 
    public MediaResponseListener mMediaResponseListener; 

    // ... Your code 

    // When some error occurs or you want to send some information to the launching Activity 

    mMediaResponseListener.mediaResponseReceiver(result); 
} 

そして、あなたのActivityからServiceを開始しているときは、Serviceinterfaceの参照を渡す必要があります。したがって、あなたのMainActivityでは、このようなことをする必要があります。ここで

private AudioService mAudioService; 
mAudioService. mMediaResponseListener = this; 
startService(); 

あなたがビジーウェイトを回避することができ、時間にService時からの応答を受け取ることができる方法です。

これで、ローカルブロードキャストで既に試したように、この動作は他の多くの方法で実現できます。

BroadcastServiceから届いたときに呼び出されるActivityBroadcastReceiverと宣言してください。

Here's a nice implementation of how you can send and receive broadcast.

関連する問題