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

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_alert関数が呼び出され、トーストで「アラートオン」になります。したがって、正常に機能しています。

もう一度radio_offボタンをチェックしてからradio_onボタンをチェックすると、「アラートオン」トーストが表示されますが、トーストが2回来ています。同様に、もう一度radio_onボタンを選択すると、トーストが3回目に表示されますが、必要なのは1回だけです。これは、タイマーが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 に答える