1

以下是我的代码:

在 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);
}

我的服务类

@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_alert 函数并在 toast 中获得“警报”。所以它工作正常。

如果我再次检查radio_off按钮然后检查radio_on按钮,我会收到“警报”吐司,但吐司会来两次。同样,如果我再次选择该radio_on按钮,吐司将第三次显示,但我只需要一次。这是因为计时器每 10 秒运行一次。单击按钮后,我想停止计时器radio_off

问题是,一旦我启动计时器,我就没有进一步停止它。我应该何时以及如何取消课堂上的定时器任务?

4

4 回答 4

9

首先,以单独的方式创建您的 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;
     }   
}
};
于 2012-04-25T07:33:10.583 回答
4
if(timerTask!=null){
    timer.cancel();
}

您可以使用代码停止/取消计时器

于 2012-04-25T07:25:36.813 回答
3

首先创建一个类扩展 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();
}

而已。

于 2012-04-25T07:32:53.657 回答
2

我可以使用以下代码停止计时器和任务:

    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;
    }
于 2013-07-10T18:15:01.837 回答