2016-04-19 15 views
0

Ich mache ein Spiel, wo, wenn der Spieler mit Bär schneidet, wird es den runnable Thread stoppen. aber irgendwie wird es überhaupt nicht aufhören. Wenn der Spieler den Bären schneidet, sollte der Spieler tot sein. Der Dead Loop wird aufgerufen, aber das Runnable wird nicht gestoppt. Ich habe die runnable Schleife wie untenRunnable wont stop

protected void movement() { 

    final int delay = 5; 
    speed = 20; 

    r = new Runnable() { 

     @Override 
     public void run() { 

      if (countscore % 300 == 0) { 
       speed = speed + 5; 

      } 

      bear1.setY(bear1.getY() + speed); 
      bear2.setY(bear2.getY() + speed); 
      reframeroad(); 

      if ((animImageView.getX() < bear1.getX() + 50 && animImageView.getX() > bear1.getX() - 50) || 
        (animImageView.getX() > bear2.getX() && animImageView.getX() < bear2.getX())) { 
       System.out.println("goes inside getx intersects x "); 
       dead(); 

      } 

      if (Rect.intersects(thiefRect, bear1Rect) || Rect.intersects(thiefRect, bear2Rect)) { 
       System.out.println(" goes inside intersects if loop "); 

       dead(); // this gets called 
      } 

      h.postDelayed(this, delay); 
     } 
    }; h.postDelayed(r, speed); 
} 

public void dead(){ 
    System.out.println("before callbacks null"); 
    h.removeCallbacksAndMessages(r); 

    System.out.println("goes inside dead function"); 

    bear1.setVisibility(View.INVISIBLE); 
    bear2.setVisibility(View.INVISIBLE); 
    animImageView.setVisibility(View.INVISIBLE); 


    scorebox.setText(countscore + ""); 
    scorebox.setVisibility(View.VISIBLE); 
    score.setVisibility(View.VISIBLE); 

    retry.setVisibility(View.VISIBLE); 

    retry.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivity(new Intent(GameActivity.this, GameActivity.class)); 
      finish(); 
     } 
    }); 
} 

habe ich versucht, eine Menge, aber ich werde immer noch auf alle 5ms zurückrufen.

Meine Konsole Schleifen wie jedes dieser Zeit

> 04-19 10:36:40.687 14923-14923/: goes inside getx intersects x 
> 04-19 10:36:40.687 14923-14923/: before callbacks null 
> 04-19 10:36:40.687 14923-14923/: goes inside dead function 
> 04-19 10:36:40.747 14923-14923/: goes inside getx intersects x 
> 04-19 10:36:40.747 14923-14923/: before callbacks null 
> 04-19 10:36:40.747 14923-14923/:goes inside dead function 
> 04-19 10:36:40.807 14923-14923/: goes inside getx intersects x 
> 04-19 10:36:40.807 14923-14923/: before callbacks null 
> 04-19 10:36:40.807 14923-14923/: goes inside dead function 
> 04-19 10:36:40.868 14923-14923/: goes inside getx intersects x 
> 04-19 10:36:40.869 14923-14923/: before callbacks null 
> 04-19 10:36:40.869 14923-14923/: goes inside dead function 

auch die meine Gäste nach der toten Funktion auf der Erhöhung halten

scorebox.setText(countscore + ""); 

genannt Wie kann ich den ausführbaren Thread stoppen?

+0

wo sind Sie '.start()' das neue runnable? es könnte sein, dass Sie es über den Hauptthread als regulären Funktionsaufruf –

+0

ausführen, sobald meine Aktivität startet, startet Runnable. . nie gemacht .start() – Pujan

+1

@Gilad - die Runnable wird durch den Handler gestartet ..... – Opiatefuchs

Antwort

2

Ihr tot() Funktion wird vor dem Aufruf genannt:

h.postDelayed(this, delay); 

Versuchen Sie, eine Variable Hinzufügen anklagen, wenn es wieder ausgeführt werden soll.

... 
r = new Runnable() { 

    @Override 
    public void run() { 

     if (countscore % 300 == 0) { 
      speed = speed + 5; 

     } 

     bear1.setY(bear1.getY() + speed); 
     bear2.setY(bear2.getY() + speed); 
     reframeroad(); 

     boolean isDead = false; 

     if ((animImageView.getX() < bear1.getX() + 50 && animImageView.getX() > bear1.getX() - 50) || 
       (animImageView.getX() > bear2.getX() && animImageView.getX() < bear2.getX())) { 
      System.out.println("goes inside getx intersects x "); 
      dead(); 
      isDead = true; 
     } 

     if (Rect.intersects(thiefRect, bear1Rect) || Rect.intersects(thiefRect, bear2Rect)) { 
      System.out.println(" goes inside intersects if loop "); 
      isDead = true; 
      dead(); // this gets called 
     } 
     if (!isDead) { 
      h.postDelayed(this, delay); 
     } 
    } 
}; h.postDelayed(r, speed); 


public void dead(){ 
    //Remove this --> h.removeCallbacksAndMessages(r); 

    System.out.println("goes inside dead function"); 
    .... 
+0

Das hat funktioniert. Vielen Dank Sir. – Pujan

+0

seine übliche Praxis zu machen, überprüfen booleans 'volatile', um sicherzustellen, dass ihr Flip von allen laufenden Threads gesehen wird –