オーディオファイルの再生時にランタイム例外を処理するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2445838

質問

クリックリスナーでオーディオファイルを再生するボタンがあります。音声ファイルの再生中にボタンを何度もクリックすると、アプリがクラッシュします。解決策は何ですか?

参考用のコードを次に示します。

 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 ステートメントを含める必要がありますが、このコードは何をすべきかについての一般的なアイデアを提供するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top