3

こんにちは、ANR (Application Not Responding) エラーが発生しましたが、その理由がわかりません。「待機」をクリックすると、すべてが完全に機能し、ANR はもう戻ってきません。

MediaPlayer をサービスとして使用する場合は、単純な .prepare() と .start() ではなく、.prepareAsync と onPrepared() メソッドを使用することをお勧めします。UI スレッドをロックせず、うまく機能します。

問題は、ファイルを開くときにすべての ANR が発生するわけではなく (より高いプロセッサがあると推測できます)、ファイルの再生中および CPU がせいぜい数 % のときにランダムに発生することです。先に述べたように、無反応に近いものは何もなく、UI スレッドにはほとんど残っていません。

唯一の手がかりは、最初にトラックを再生したときは ANR を取得せず、それが変更された後であるということです。prepareAsync スレッドが衝突していると思い、自分でロックを追加しました。変化なし。

新しいトラックを開始する前に、毎回メディア プレーヤーを解放しようとしました。変化なし

私は多くのシーケンスでリセット、停止などを試みました。変化なし。

誰も同じことを経験しましたか?

回避策として、ANR を自動的に却下する方法はありますか? それが答えではないことはわかっていますが、オプションが見つかりません。私はルート化されたタブレットを使用しています(ROMをコンパイルしました)、それは自分専用です-配布はありません

ありがとう

4

1 に答える 1

2

標準サービスは実際にはメイン スレッドで実行されます。ANR が発生している場合は、おそらく MediaPlayer 全体を別のスレッドに移動する必要があります。ドキュメントを引用するには

Service クラスに関するほとんどの混乱は、実際にはそれがそうでないものに関係しています。

  • サービスは個別のプロセスではありません。
  • サービスはスレッドではありません。それ自体は、メイン スレッドから離れて作業を行う手段ではありません (アプリケーションが応答しないエラーを回避するため)。

既に使用していprepareAsync()ますが、MediaPlayer の実行中にエラーが発生したと述べたように、準備中ではありません。ANR の正確な原因について詳しく説明する必要はありませんが、HandlerThread に切り替えることが最善の選択肢だと思います。

于 2013-03-26T20:02:55.947 に答える