2013-03-15 3 views
0

J'essaie de définir un son qui sera bouclé par intervalles de 1 seconde lorsque le bouton bascule est coché. J'ai essayé de faire un asynctask pour ça mais quand j'ouvre cette activité ça plante, pourquoi? Que dois-je faire pour que le son passe en boucle à intervalles d'une seconde lorsque le bouton à bascule est coché?Android Lecture du son dans AsyncTask lorsque ToggleButton est coché

résolu par AlexanderFox

Mon code actuel java:

final ToggleButton metronomepp = (ToggleButton) findViewById (R.id.metronomepp); 
    metronomepp.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       Log.i("Metronome", "InWhile"); 

       if(isChecked) { 
        currentTask = new TimerTask() { 
         @Override 
         public void run() { 
          if (metronome.isPlaying()) { metronome.pause(); } 
          metronome.seekTo(0); 
          metronome.start(); 
         } 
        }; 
        myTimer.schedule(currentTask, 0, 1000); 
       } else { 
        currentTask.cancel(); 
       } 
     } 
    }); 

J'ai maintenant problème avec le changement de temps à attendre. J'ai double variable timetw et chnaged 1000 à timetw avec mouler à long, mais l'application se bloque lorsque je vérifie le bouton bascule si j'avais changé l'heure en fonction de la sélection dans l'application.

+0

qui est une exception de pointeur null. cela signifie que quelque chose est nul. postez la trace de la pile _full_, et vous verrez par magie d'où elle vient, comme si elle était écrite en clair. – njzk2

+0

avez-vous ajouté l'activité com.example.guitartools.MetronomeActivity dans votre fichier manifeste? – SKK

+0

Où puis-je voir la trace complète de la pile? –

Répondre

1

Je pense que l'utilisation de la boucle infinie "while" est une très mauvaise idée. Mieux vaut utiliser la méthode schedule de la classe Timer pour y parvenir. Lorsque vous n'avez plus besoin de répéter cette tâche, appelez simplement la méthode "cancel" de Timer.

Par exemple (corrigé):

private TimerTask currentTask; 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if(isChecked) { 
     currentTask = new TimerTask() { 
      @Override 
      public void run() { 
       if (metronome.isPlaying()) { metronome.pause(); } 
       metronome.seekTo(0); 
       metronome.start(); 
      } 
     }; 
     myTimer.schedule(currentTask, 0, 1000); //in this line we tell to repeat sound every second without start delay 
    } else { 
     currentTask.cancel(); 
    } 
} 
+0

Cela fonctionne pour la première fois quand je vérifie bouton bascule et décochez-le, mais quand je le vérifie à nouveau l'application se bloque. –

+0

Pouvez-vous fournir une pile d'erreur complète? Ou cela équivaut à une erreur dans la description? – AlexanderFox

+0

Ajouté à la question –