2013-01-24 89 views
2

我創建了一個處理程序,以模擬計時器任務。 ,因爲TimerTask在不同的平板電腦上的行爲不同。 所以我創建了這個處理程序方法。 在計時器中有一種方法timerTask.cancel(); 但如何停止該處理程序 即使在退出應用程序後它仍會繼續運行。 ,因爲即使在按下後,您仍可以看到正在運行的日誌。如何停止Handler的遞歸調用?

Handler handler = new Handler(); 

public void recursivelycallHandler(){ 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      Log.d("handler is running", "true" + System.currentTimeMillis()); 
      recursivelycallHandler(); 

     } 
    }, 100); 
} 
+0

而您想要停止它嗎?我的意思是任何條件? –

+0

關閉應用程序後 –

+0

如果您只想在應用程序靠近時停止,那麼只需將覆蓋方法onDestroy並在此時刪除處理程序的回調。如果你還沒有得到解決方案,那麼讓我評論你有哪些困難。 –

回答

2

有3種方法來做到這一點..

handler.removeCallbacks(Runnable r); 
handler.removeCallbacksAndMessages(null); 
handler.removeMessages(int what) 

在你的情況下前兩個似乎可行..添加任何上述方法中的OnDestroy或在監聽到backpress ..

+0

這工作...謝謝...將接受你的答案在5分鐘作爲stackoverflow不讓我這樣做rt now –

0

您可以將標誌(布爾VAR)來檢測,如果你需要調用你的處理程序和退出應用程序更改之前此標誌爲false,並停止調用處理程序。

0

你可以做這樣的事情如下:

public void recursivelycallHandler(){ 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      Log.d("handler is running", "true" + System.currentTimeMillis()); 
      if(YOUR_CONDITION){ 
       recursivelycallHandler(); 
      } 

     } 
    }, 100); 
} 

希望你明白了我的觀點。

隨時發表評論。

0

只需添加isFinished到您的run方法:

handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     if (isFinished()) 
       return; 
     Log.d("handler is running", "true" + System.currentTimeMillis()); 
     recursivelycallHandler(); 

    } 
}, 100); 
+0

我會建議調用removeCallback,以避免泄漏 – Blackbelt

0

通過將任何條件

Handler handler = new Handler(); 
int i = 0; 
Runnable myRunnable = new Runnable() { 
     @Override 
     public void run() { 

      Log.d("handler is running", "true" + System.currentTimeMillis()); 
      if(i>5) 
       handler.removeCallback(myRunnable); 
      else{ 
       i++; 
       handler.postDelayed(myRunnable, 100); // here is self calling 
      } 

     } 
    }; 
} 
handler.postDelayed(myRunnable, 100); 

它的遞歸方法,但你可以調用運行同一個Runnable對象(),而不是遞歸方法和根據特定情況/條件刪除該對象