2013-06-28 41 views
0

我有一個從開始移動的球。我想停止點擊按鈕上的球。當我點擊按鈕時顯示吐司,但球繼續移動。它不停止。停止移動球在按鈕上點擊

請指導我如何停止點擊按鈕上的球。我的Activity的代碼就在那裏。

@SuppressLint("HandlerLeak") 
public class BounceActivity extends Activity { 

    private static final int GAME_START = 500; 
    private static final int GAME_STOP = 600; 

    Thread myRefreshThread = null; 
    BounceView myBounceView = null; 
    int width = 0; 
    int height = 0; 

    Handler myGUIUpdateHandler = new Handler() { 

     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case BounceActivity.GAME_START: 
       myBounceView.invalidate(); 
       break; 
      case BounceActivity.GAME_STOP: 
       Log.d("BounceView", "Game state: " + BounceView.game_state); 
       Toast.makeText(BounceActivity.this, "Game stopped", Toast.LENGTH_SHORT).show(); 
       myRefreshThread = null; 
       break; 
      } 
      super.handleMessage(msg); 
     } 
    }; 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 

     this.myBounceView = new BounceView(this, dm.widthPixels, dm.heightPixels); 
     this.setContentView(myBounceView); 
     myRefreshThread = new Thread(new RefreshRunner()); 
     myRefreshThread.start(); 
    } 

    class RefreshRunner implements Runnable { 

     @Override 
     public void run() { 
      while (myRefreshThread != null) { 
       if(BounceView.game_state == 0) { 
        Message msg = Message.obtain(); 
        msg.what = BounceActivity.GAME_START; 
        myGUIUpdateHandler.sendMessage(msg); 
       } else if (BounceView.game_state == 1) { 
        Message msg = Message.obtain(); 
        msg.what = BounceActivity.GAME_STOP; 
        myGUIUpdateHandler.sendMessage(msg); 

       } 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } 
      } 
     } 

    }} 

回答

0

您正在訪問並在不同的線程上設置myRefreshThread,這可能會產生問題。

您可以在您的while循環中檢查myRefreshThread是否爲空,您可以向RefreshRunner添加一個「運行」標誌,並將其設置爲false的停止方法。 比在while循環中檢查該標誌。

保持對您的RefreshRunner(您傳遞給myRefreshThread的引用)的引用,並在想要停止動畫時調用stop()。

class RefreshRunner implements Runnable { 

    private void mRunning = true; 

    public void stop() { 
      mRunning = false; 
    } 

    @Override 
    public void run() { 
     while (mRunning) { 
      if(BounceView.game_state == 0) { 
       Message msg = Message.obtain(); 
       msg.what = BounceActivity.GAME_START; 
       myGUIUpdateHandler.sendMessage(msg); 
      } else if (BounceView.game_state == 1) { 
       Message msg = Message.obtain(); 
       msg.what = BounceActivity.GAME_STOP; 
       myGUIUpdateHandler.sendMessage(msg); 

      } 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
    } 

}}