2016-04-19 139 views
0

我正在制作一个游戏,如果玩家与熊相交,它将停止可运行的线程。但不知何故,它不会停下来。所以当玩家与熊相交时,玩家应该死亡。死循环被调用,但不会停止可运行。 我做了可运行的循环,如下Runnable不会停止

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

我尝试了很多,但我仍然会再打上每5ms。

我的控制台环路这样

> 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 

即使我的成绩一直在死功能后增加每次被称为

scorebox.setText(countscore + ""); 

如何停止该运行的线程?

+0

你在哪里'.start()'新的可运行?可能是因为我的活动一开始,就会通过主线程作为普通函数调用 –

+0

运行它,可启动运行。 。从未做过任何.start() – Pujan

+1

@Gilad - runnable通过处理程序启动..... – Opiatefuchs

回答

2

你死()函数在调用之前调用:

h.postDelayed(this, delay); 

尝试增加一个变量来起诉,如果它应该再次运行。

... 
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

这工作。非常感谢先生。 – Pujan

+0

其常见做法,使运行检查布尔变量'挥发性',以确保他们的翻转是所有正在运行的线程 –