オーディオファイルの再生時にランタイム例外を処理するにはどうすればよいですか?
-
20-09-2019 - |
質問
クリックリスナーでオーディオファイルを再生するボタンがあります。音声ファイルの再生中にボタンを何度もクリックすると、アプリがクラッシュします。解決策は何ですか?
参考用のコードを次に示します。
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
// Toast.makeText(getBaseContext(),
// "Mercy audio file is being played",
// Toast.LENGTH_LONG).show();
if (status==true)
{
mp.stop();
mp.release();
status = false;
}
else
{
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
//mp.start();
try{
mp.start();
status= true;
//mp.release();
}catch(NullPointerException e)
{
Log.v("MP error",e.toString());
}
}
mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
status = false;
}
}
);
}
};
解決
2 つのこと:
1.クラッシュをデバッグし、どこで障害が発生しているのか (どの行なのか) を確認します。
2.ステートメント全体を try/catch で囲み、単純にキャッチします。 例外.
例外がある場合、またはコードが失敗している箇所についてより良いアイデアがある場合は、それを修正する方法についてアドバイスを提供するのがはるかに簡単になります。実際のところ、問題を解決するのにアドバイスさえ必要ないかもしれません。最終的には自分で問題を解決し、その後、自分自身で成功の果実を得ることができるかもしれません。
コメントごとに更新:
のドキュメント メディアプレーヤー OP で発生している症状を考慮して、何が問題であるかを示します。
再生を停止するには、電話をかけます
stop()
. 。後でメディアを再生したい場合は ねばならぬreset()
そしてprepare()
のMediaPlayer
呼び出す前のオブジェクトstart()
また。(create()
電話をかけるprepare()
初めて。)
再生ボタンを何度も押しすぎると、メディアが準備完了状態にならず、例外がスローされる可能性があるようです。再生ボタンを無効にするという考えは有効であり、この状況に対処する必要があります。
プログラムで何を実行するかを示すコード例を次に示します。
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
if(isPressed)
{
return;
}
isPressed = true;
// create your media player
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
// set your listener
mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
if(!isPressed)
{
return;
}
isPressed = false;
// re-enable your play button
playButton.enable();
// disable the pause button
pauseButton.disable();
mp.release();
mp.prepare();
}
}
);
// disable the play button
playButton.disable();
// enable the pause button
pauseButton.enable();
// start playback
mp.start();
}
};
もちろん、アプリがクラッシュしないように適切な try/catch ステートメントを含める必要がありますが、このコードは何をすべきかについての一般的なアイデアを提供するはずです。