2013-11-27 92 views
1

我有一個方法,我想每x秒調用一個問題。 在我的類的構造函數我有類似的東西:與定時器的麻煩 - android

public class MyClass extends RelativeLayout{ 

    public MyClass(Context context) { 
    // bla bla…. 

    mTimer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
     public void run() { 
      callMyMethodPeriodically(); 
      } 
    }, 0, 20000); // every 20 seconds.. 
    } 
} 

當我按下後退按鈕時,callMyMethodPeriodically方法仍然被稱爲.. 即使我退出應用程序! 你有什麼想法嗎?我怎樣才能阻止這個定期打電話? 謝謝

+1

在'onPause'中取消定時器 – Raghunandan

回答

2

嘗試重寫你的活動中的onPause方法中,在onPause將被調用時,系統即將開始恢復以前的活動。這通常用於將未保存的更改提交給持久性數據,停止動畫和其他可能消耗CPU的內容等。此方法的實現必須非常快速,因爲在此方法返回之前,下一個活動不會恢復。

@Override 
    protected void onPause() { 
     super.onPause(); 
     mTimer.cancel(); 
     mTimer.purge(); 
     mTimer = null; 
    } 
+0

由於其長度和內容,此答案被標記爲低質量。你應該多加一點,以幫助解釋OP和其他人的背景。 – paqogomez

+1

對不起,剛剛編輯...現在好了? – GhostDerfel

1

您可以嘗試timer.canel()方法也可以通過這種方式

私人Runnable接口可運行=新的Runnable(){

public void run() 
{ 
    // 
    // Do the stuff 
    // 

    handler.postDelayed(this, 1000); 
} 

}做到這一點;

,並停止:

handler.removeCallbacks(runnable); 

或這樣

你可以看看使用的ScheduledThreadPoolExecutor,而不是一個計時器。

用法非常簡單。您創建一個執行的一個實例:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 

然後當你想添加一個任務,您撥打:

executor.scheduleAtFixedRate(myRunnable, delay, interval, unit); 

哪裏myRunnable是你的任務(實現了Runnable接口),延遲第一次執行任務之前多長時間,間隔是第一次執行後執行任務之間的時間。延遲和時間間隔根據單位參數進行測量,可以是TimeUnit。*(其中*是SECONDS,MINUTES,MILLISECONDS等)。

然後停止調用執行:

executor.shutdownNow();