2016-08-11 8 views
0

私はアプリケーションにオーディオファイルを入れて、ボタンをタッチしてもう一度タッチすると再生が停止します。ここアプリケーション内のオーディオファイルは、クリックしても止まらず、再生を再開します。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    Button one = (Button) findViewById(R.id.buttonId); 
    final MediaPlayer mp = new MediaPlayer(); 

    one.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      if(mp.isPlaying()) 
      { 
       mp.stop(); 
      } 

      try { 
       mp.reset(); 
       AssetFileDescriptor afd; 
       afd = getAssets().openFd("mosq.mp3"); 
       mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
       mp.prepare(); 
       mp.setLooping(true); 
       mp.start(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 


}); 

が私のコードで、この部分:

if(mp.isPlaying()) 
     { 
      mp.stop(); 
     } 

は、何らかの理由で動作しませんでした。

+0

他にもいくつかのバグがあります。私の答えをご覧ください。 – EJoshuaS

答えて

2

returnの文章を必ずmp.stop()にしてください。私は音が停止しない理解できるものから、

が、コードの次の部分はまだだけでも、あなたならば、ジョージ・Dを正しく指摘したように、あなたはメディアが無条件で再生を開始

+0

または、 "開始"ロジックを "else"ステートメントに入れます。 – EJoshuaS

+0

'if(mp.isPlaying()) { mp.stop(); リターン; } 「 うまく働いた、ありがとう! –

0

が実行されますので、それが再び開始それを止めた。ただ、
*私はこれがあなたの意図したものであるのかはわからないが、プレイヤーが今まで一時停止しません。これは、その中のいくつかの他の潜在的なバグを持ってい

if(mp.isPlaying()) 
     { 
      mp.stop(); 
     } 
     else { 
      try { 
      mp.reset(); 
      AssetFileDescriptor afd; 
      afd = getAssets().openFd("mosq.mp3"); 
      mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
      mp.prepare(); 
      mp.setLooping(true); 
      mp.start(); 
      } catch (IllegalStateException e) { 
      e.printStackTrace(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     } 

:あなたは彼のソリューションを使用するかのような何かができます停止し、最初から再起動します。再開または再試行を試みると、毎回オーディオファイルが完全にリロードされます。最低限、これはリソースの無駄です。さらに、UIの観点から期待される動作ではない可能性があります。
* OnCreateメソッド内でローカル変数としてMediaPlayerオブジェクトを定義したくない場合。これがまったく機能する唯一の理由は、メモリリークがあることです(クリックに対してイベントハンドラの登録を解除することは決してありません)。メモリリークが発生していない場合、onCreateメソッドを完了するとオブジェクトはガベージコレクションの対象となり、フレームワークに関してはもはや存在しなくなります。

+0

「これはあなたが意図したものなのかどうか分かりませんが、プレイヤーは一度も止まらず、ちょうど停止して最初からやり直します。 メモリリークを教えてください。 –

関連する問題