2012-04-25 104 views
1

下面是我的代码:如何停止计时器的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功能,并在烤面包中获得“警报开启”。所以它的工作正常。

如果我再次检查radio_off按钮,然后检查radio_on按钮,我得到“警戒”吐司,但吐司来了两次。同样,如果我再次选择radio_on按钮,则第三次显示敬酒,但我只需要一次。这是由于计时器每10秒运行一次。一旦我点击radio_off按钮,我想停止计时器。

问题是,一旦我启动了计时器,我就没有再停下来。何时以及如何取消班上的计时任务?

回答

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; 
    } 
} 
}; 
4
if(timerTask!=null){ 
    timer.cancel(); 
} 

您可以使用代码来停止/删除计时器

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

完蛋了。

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