15

Web サーバーから音楽をストリーミングするアプリを構築しています。アプリには、再生に MediaPlayer を使用するフォアグラウンド サービスがあります。

私のコードはこの例に基づいています: http://developer.android.com/guide/topics/media/mediaplayer.html

この例では、prepareAsync() 呼び出し以外は何もスレッド化されていません。私を混乱させているのは、 Service クラスについて読んだときに、次の情報を見つけたことです。

「注意: サービスは、そのホスティング プロセスのメイン スレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません (特に指定しない限り)。つまり、サービスが何かを実行する場合、 CPU を集中的に使用する作業やブロック操作 (MP3 の再生やネットワークなど) を処理する場合は、その作業を行うためにサービス内に新しいスレッドを作成する必要があります。別のスレッドを使用することで、アプリケーションが応答しない (ANR) エラーのリスクが軽減され、アプリケーションのメイン スレッドは、アクティビティとのユーザー インタラクション専用のままにすることができます。」

私が尋ねている理由は、オーディオをストリーミングするときにアプリが時々 (通常は接続を失ったとき) UI をフリーズさせるからです。アクティビティとサービスが同じスレッドで実行されるため、サービスが CPU を集中的に処理している場合、UI がフリーズすることは完全に理解しています。しかし、MediaPlayer がこれほど強力であると期待する必要がありますか? つまり、別のスレッドで実行する必要がありますか?

4

3 に答える 3

14

残念ながら、特にネットワークからファイルを再生している場合は、prepareAsync() を呼び出すだけでは、ANR プロンプトと数秒間のアプリケーションのハングを回避するのに十分ではありません。最善の策は、MediaPlayer インスタンスを独自のスレッドに配置するか、少なくとも Handler で集中的な呼び出しを実行することです ( などmediaplayer.start())。私は MediaPlayer を 1 年以上使用していますが、状況によっては、さまざまな呼び出しの後に確実にハングすることがわかります。

于 2013-06-12T12:55:03.293 に答える
0

音楽のストリーミングが原因で、音楽のストリーミングが終了するまでメイン スレッドが停止する可能性はありますか? これが、速度が低下している理由である可能性があります。

私は専門家ではなく、現在自分自身を学んでいますが、考える価値はあります。

于 2013-03-28T10:39:30.950 に答える
-2

いいえ、ネットワーク転送を行っている場合は、それをスレッドに保持する必要があります.mediaplayerはそれほどリソースを消費しません. あなたの活動にそれを保管してください。

于 2013-03-27T12:22:00.750 に答える