2013-05-26 1 views
0

J'essaie de faire jouer l'instrument d'automation, mais je suis bloqué pour arrêter les boucles exécutables. Voici mon code complet MainActivity.java.removeCallbacks à l'intérieur de la méthode d'exécution vs méthode onClick

public class MainActivity extends Activity implements OnClickListener{ 

    Button bt1,bt2; 
    Handler handler; 
    Runnable runnable; 
    MediaPlayer mp; 
    int i; 

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

     bt1 = (Button)findViewById(R.id.button1); 
     bt2 = (Button)findViewById(R.id.button2); 
     bt1.setOnClickListener(this); 
     bt2.setOnClickListener(this); 

     mp = MediaPlayer.create(MainActivity.this, R.raw.sound); 
    } 

    void playInstrument(){ 
     if(mp.isPlaying()){ 
      mp.release(); 
     } 
     mp = MediaPlayer.create(MainActivity.this, R.raw.sound); 
     mp.start(); 
    } 

    void play(){ 
     i=0; 
     handler = new Handler(); 
     runnable = new Runnable() { 
      @Override 
      public void run() { 
       i++; 
       System.out.println(i); 
       if(i==3){ 
        System.out.println("Finish Playing"); 
        MainActivity.this.handler.removeCallbacks(MainActivity.this.runnable); 
       } 
       playInstrument(); 
       handler.postDelayed(this, 1000); 
      } 
     }; 
     runnable.run(); 
    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.button1: 
      play(); 
      break; 
     case R.id.button2: 
      handler.removeCallbacks(runnable); 
      break; 
     } 
    } 

} 

Voici le xml activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 
    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="43dp" 
     android:text="Start" /> 
    <Button 
     android:id="@+id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/button1" 
     android:layout_below="@+id/button1" 
     android:layout_marginTop="36dp" 
     android:text="Stop" /> 
</RelativeLayout> 

Je peux l'arrêter en utilisant button1 cliquez, mais pourquoi il n'arrêtera automatiquement si la valeur i déjà 3? Il s'affiche Terminer Lecture sur Log Cat mais continue à boucler. Peut-être que c'est juste javaish problème que je ne comprends pas

+0

il est toujours en boucle depuis que vous appelez handler.postDelayed (this, 1000); Quoi qu'il en soit – pskink

Répondre

0
if(i==3){ 
System.out.println("Finish Playing"); 
MainActivity.this.handler.removeCallbacks(MainActivity.this.runnable); 
return; 
} 

sinon vous le postez à nouveau;

+0

whoa .. c'est réponse rapide et a bien fonctionné, mais je ne sais pas pourquoi il doit y avoir déclaration de retour, n'est-ce pas une méthode remboursable? Y at-il une référence que je devrais commencer? –

+0

le retour va casser le flux normal de l'exécution lorsque la condition est remplie – Blackbelt

Questions connexes