2013-04-24 61 views
6

我必須在開始按鈕點擊時開始運行,並在點擊暫停按鈕時停止它。 我對啓動開始按鈕單擊運行的代碼是如何停止Android上按鈕點擊Runnable?

// TODO Auto-generated method stub 
    //while (running) { 
    mUpdateTime = new Runnable() { 
      public void run() { 
    sec += 1; 
     if(sec >= 60) { 
      sec = 0; 
      min += 1; 
      if (min >= 60) { 
       min = 0; 
       hour += 1; 
      } 
     } 
     Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec)); 
     mHandler.postDelayed(mUpdateTime, 1000); 
      } 
     }; 
     mHandler.postDelayed(mUpdateTime, 1000); 
    //} 

現在我想停止暫停按鈕可運行單擊

pause_btn.setOnClickListener(新OnClickListener(){

 @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      play_btn.setVisibility(View.VISIBLE); 
      pause_btn.setVisibility(View.INVISIBLE); 

     } 
    }); 

如何我可以停止運行的上暫停按鈕點擊,如果有人知道,請幫助我。

+1

的可能的複製[安卓:我如何停止的Runnable( http://stackoverflow.com/questions/9458097/android-how-do-i-stop-runnable) – 2016-05-12 09:52:35

回答

12

使用

mHandler.removeCallbacksAndMessages(runnable); 

在暫停按鈕點擊。

+7

這不會停止正在進行的操作。 – Gusdor 2013-04-24 09:46:00

7

保持一個boolean cancelled標誌存儲狀態。在將它初始化爲false,然後在停止按鈕單擊時將其修改爲true。

而且你run()方法內繼續檢查該標誌。

編輯

上述方法通常但仍然沒有工作最合適的方式來阻止可運行/線程。有可能是其中任務被阻塞的情況,並不能檢查標誌,如下圖所示:

 public void run(){ 
     while(!cancelled){ 
      //blocking api call 
     } 
    } 

假定任務正在阻塞的API調用,然後取消標誌被修改。只要阻塞API調用正在進行,任務將無法檢查狀態更改。

替代和安全的方法

最可靠的方式來停止一個線程或任務(Runnable接口)是使用中斷機制。中斷是一種合作機制,以確保停止線程不會使其處於不一致的狀態。
在我的博客,我已經詳細討論了中斷,link

+1

AFAIK,這是關閉異步操作的最佳方法。它不是免費的(操作必須輪詢該標誌),但它允許操作在其自己的時間結束a)和b)清理其所有資源。我經常看到的方法就是放棄一個線程 - 這是一種非常危險的做法。 通過一切手段,繼承自己的Runnable並聲明此標誌以供重用! – Gusdor 2013-04-24 09:43:55

+0

如果在線程之間沒有共享任何內容(沒有基本類型,對象等),並且在停止時清除,則沒有問題。 – stephen 2013-09-07 06:37:15

-2

線程線程;
//內啓動按鈕

thread=new Thread(new Runnable() { 

    @Override 
    public void run() { 
    sec += 1; 
     if(sec >= 60) { 
      sec = 0; 
      min += 1; 
      if (min >= 60) { 
       min = 0; 
       hour += 1; 
     } 
     } 
     Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec)); 
     mHandler.postDelayed(mUpdateTime, 1000); 
     }); 
    thread.start(); 

//內停止按鈕

mHandler.removeCallbacksAndMessages(runnable); 
thread.stop(); 
+1

除了回答問題之外,在示例中使用Thread中的Runnable的目的是什麼? – 2015-01-07 09:32:10

0

使用下面的代碼:

handler.removeCallbacks(runnable);