2010-03-15 3 views
1

J'ai un bouton qui lit un fichier audio sur son écouteur de clic. Si le bouton est cliqué encore et encore pendant la lecture du fichier audio, l'application se bloque. Quelle est la solution?Comment gérer l'exception d'exécution lors de la lecture de fichiers audio?

Voici un code de référence:

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; 

        } 
       } 

     ); 



     } 
    }; 
+0

Pourquoi n'essayez-vous pas d'attraper juste une exception? – Kiril

+0

Il ne me montre jamais sur l'émulateur. Je dois le tester sur l'appareil. Et lorsque le bouton est continuellement cliqué 8 fois ou plus, l'application se bloque. J'ai utilisé une variable booléenne publique appelée status et essayé de régler ses valeurs pour jouer seulement quand un son existant n'est pas joué. Je me demande si la méthode booléenne isPlaying() peut m'aider? Je suis coincé en ce moment. Tout indice? –

+0

Si l'application tombe en panne, je suis sûr qu'elle lancera une exception, alors essayez d'attraper l'exception, écrivez-la dans votre journal, puis déboguez l'exception. – Kiril

Répondre

0

Deux choses: 1.
Debug l'accident et voir où il est défaillant (quelle ligne).
2. Entourez l'ensemble de la déclaration avec un essai/catch et attrapez simplement un Exception.

Si vous avez une exception ou une meilleure idée de l'échec de votre code, alors il sera beaucoup plus facile de vous conseiller sur la façon de le résoudre ... en fait, vous n'aurez peut-être même pas besoin de conseils réparez-le, vous pourriez finir par résoudre le problème par vous-même et ensuite vous récolterez les fruits de votre propre succès.

mise à jour par des commentaires:
La documentation MediaPlayer indique ce qui pourrait être le problème étant donné les symptômes de l'OP est de voir:

Pour arrêter la lecture, appelez stop(). Si vous souhaitez rejouer plus tard le média, puis vous devez reset() et prepare() l'objet MediaPlayer avant d'appeler à nouveau start(). (create() appelle prepare() la première fois.)

On dirait que si le bouton de lecture est pressé trop de fois, puis les médias peuvent finir par ne pas être dans l'état préparé et jeter ainsi une exception. L'idée de désactiver le bouton de lecture est valide et il devrait prendre soin de cette situation.

Voici un code d'illustration sur ce que vous voulez que votre programme pour le faire:

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(); 
    } 
}; 

Bien sûr, vous devriez avoir les déclarations try/catch appropriées là-dedans pour que votre application ne tombe pas en panne, mais ce code doit vous donner une idée générale de ce qu'il faut faire.

+0

J'apprécie ce que vous avez conseillé ici. J'ai mis au point le code requis. Mais maintenant je veux que mon bouton soit désactivé pendant que le son est joué. Et une fois le fichier audio terminé, je veux que mon bouton soit activé. Une idée à ce sujet? –

Questions connexes