Web サーバーから音楽をストリーミングするアプリを構築しています。アプリには、再生に MediaPlayer を使用するフォアグラウンド サービスがあります。
私のコードはこの例に基づいています: http://developer.android.com/guide/topics/media/mediaplayer.html
この例では、prepareAsync() 呼び出し以外は何もスレッド化されていません。私を混乱させているのは、 Service クラスについて読んだときに、次の情報を見つけたことです。
「注意: サービスは、そのホスティング プロセスのメイン スレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません (特に指定しない限り)。つまり、サービスが何かを実行する場合、 CPU を集中的に使用する作業やブロック操作 (MP3 の再生やネットワークなど) を処理する場合は、その作業を行うためにサービス内に新しいスレッドを作成する必要があります。別のスレッドを使用することで、アプリケーションが応答しない (ANR) エラーのリスクが軽減され、アプリケーションのメイン スレッドは、アクティビティとのユーザー インタラクション専用のままにすることができます。」
私が尋ねている理由は、オーディオをストリーミングするときにアプリが時々 (通常は接続を失ったとき) UI をフリーズさせるからです。アクティビティとサービスが同じスレッドで実行されるため、サービスが CPU を集中的に処理している場合、UI がフリーズすることは完全に理解しています。しかし、MediaPlayer がこれほど強力であると期待する必要がありますか? つまり、別のスレッドで実行する必要がありますか?