1

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

参照用のコードは次のとおりです。

 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;

                   } 
              }

          ); 



        }
    };
4

1 に答える 1

0

2つのこと:
1。クラッシュをデバッグし、どこで失敗しているか(どの行)を確認します。
2.ステートメント全体をtry/catchで囲み、単にExceptionをキャッチします。

コードが失敗する例外やより良いアイデアがある場合は、それを修正する方法についてアドバイスを与える方がはるかに簡単です...実際のところ、修正するためのアドバイスさえ必要ないかもしれません。自分で問題を解決してしまうかもしれません。そうすれば、自分の成功の成果を得ることができます。

コメントごとの更新:MediaPlayer
のドキュメントには、OPで発生している症状を考慮して問題が発生する可能性があることが示されています。

再生を停止するには、を呼び出しますstop()。後でメディアを再生したい場合は、再度呼び出す前 にオブジェクトを再生する必要がreset() あります 。(初めて電話します。)prepare()MediaPlayerstart()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ステートメントを含める必要がありますが、このコードは、何をすべきかについての一般的な考え方を提供するはずです。

于 2010-03-15T08:54:08.877 に答える