簡體   English   中英

如何停止Android計時器

[英]How to Stop Timer Android

以下是我的代碼:

在MainActivity.class中

private OnCheckedChangeListener alert_on_off_listener = new OnCheckedChangeListener(){
    public void onCheckedChanged(RadioGroup groupname, int CheckedButtonId) {

         if(CheckedButtonId==R.id.radiobutton_on){
             Toast.makeText(getApplicationContext(), "radio on", Toast.LENGTH_LONG).show();
             alert_on = true;
             display_alert();    
         }
         else{
             alert_on = false;
         }   
    }
};

public void display_alert(){

    int delay = 10000;  
    Timer timer =new Timer();
    timer.scheduleAtFixedRate(new TimerTask()
    {
        public void run() 
            {
                Intent myIntent = new Intent(HoraWatchActivity.this,MyService.class);
                startService(myIntent);
            }
    }, delay,10000);
}

MyService.class

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
    if(MainActivity.alert_on)
       Toast.makeText(getApplicationContext(), "Alert is On", Toast.LENGTH_LONG).show();
    else
       Toast.makeText(getApplicationContext(), "Alert is Off",Toast.LENGTH_LONG).show();
}

我正在檢查onCheckedChangeListener並根據選中的單選按鈕調用display_alert函數。

display_alert函數中,我以10秒的固定速率使用計時器調度,並調用myservice類。

因此,一旦我選中radio_on按鈕,它將調用我的display_aler t函數,並在吐司中顯示“ alert on”。 因此,它的工作正常。

如果我再次檢查radio_off按鈕,然后再檢查radio_on按鈕,我將得到“ alert on”烤面包,但是烤面包要來兩次。 同樣,如果我再次選擇radio_on按鈕,則將第三次顯示該吐司,但是我只需要一次。 這是因為計時器每10秒運行一次。 單擊radio_off按鈕后,我想停止計時器。

問題是,一旦啟動計時器,就不會再停止計時了。 什么時候以及如何取消班上的計時器任務?

首先,以另一種方式創建TimerTask:

class MyTimerTask extends TimerTask {
  public void run() {
    Intent myIntent = new Intent(HoraWatchActivity.this,MyService.class);
    startService(myIntent);
  }
}

聲明它在某個地方,當然對您的OnCheckedChangeListener可見:

MyTimerTask myTimerTask;

安排它:

public void display_alert() {
  int delay = 10000;  
  myTimerTask = new MyTimerTask();
  Timer timer = new Timer();
  timer.scheduleAtFixedRate(myTimerTask, delay, 10000);
}

然后將您的代碼修改為:

private OnCheckedChangeListener alert_on_off_listener = new OnCheckedChangeListener(){
public void onCheckedChanged(RadioGroup groupname, int CheckedButtonId) {

     if(CheckedButtonId==R.id.radiobutton_on){
         Toast.makeText(getApplicationContext(), "radio on", Toast.LENGTH_LONG).show();
         alert_on = true;
         display_alert();    
     }
     else{
         myTimerTask.cancel();
         alert_on = false;
     }   
}
};
if(timerTask!=null){
    timer.cancel();
}

您可以使用代碼停止/取消計時器

首先創建一個擴展TimerTask的類,使其成為對象並處理對該對象的操作。

int delay = 10000;  
Timer timer =new Timer();
myTimer mTask= new myTimer();
timer.scheduleAtFixedRate(mTask, delay, 10000);

public class myTimer extends TimerTask
{
    @Override
    public void run() {
        Intent myIntent = new Intent(HoraWatchActivity.this,MyService.class);
            startService(myIntent);         
    }
}

當您的mTask工作正常

 if(mTask!=null){
    mTask.cancel();
}

而已。

我可以使用以下代碼停止計時器和任務:

    if(null != timer)
    {

        timer.cancel();
        Log.i(LOG_TAG,"Number of cancelled tasks purged: " + timer.purge());
        timer = null;
    }

    if(task != null)
    {
        Log.i(LOG_TAG,"Tracking cancellation status: " + task.cancel());
        task = null;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM