停止并启动计时器

时间:2015-07-07 08:32:47

标签: java android timer

抱歉我的英文。我有计时器和我的魔杖如果我点击计时器打开如果我再次点击计时器关闭。但我的计时器只有一次。如果我再次点击(关闭计时器)我有这样的例外:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException: Timer was canceled
    at java.util.Timer.scheduleImpl(Timer.java:561)
    at java.util.Timer.schedule(Timer.java:481)
    at installation.ConnectDevice.callAsynchronousTask(ConnectDevice.java:211)
    at installation.ConnectDevice$1.onClick(ConnectDevice.java:153)
    at android.view.View.performClick(View.java:4240)
    ...

我不知道为什么它不起作用,请帮忙。我的课程

我的班级

private Timer timer;
int time = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.i_connect_device);

    timer = new Timer();

    // my botton
    includeDevice.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (time < 1) {
                callAsynchronousTask();
                time++;
            }

            if (time > 0) {
                stopTimer();
                time--;
            }
        }
    });

}

public void callAsynchronousTask() {
    final Handler handler = new Handler();

    TimerTask doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    try {
                        Log.e("Timer is work", "Timer is work");
                        // GetMsgs performBackgroundTask = new GetMsgs();
                        // PerformBackgroundTask this class is the class
                        // that extends AsynchTask
                        // performBackgroundTask.execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 1000 * 10); // execute in every
                                                        // 50000 ms
}

public void stopTimer() {
    timer.cancel();
}

5 个答案:

答案 0 :(得分:1)

更改onClick逻辑如下(因为在你的情况下,第一次只执行callAsynchronousTask()和stopTimer()。所以它会在下一次onClick时引发异常)

btnTimer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (time == 0) {
                    callAsynchronousTask();
                    time = 1;
                } else {
                    stopTimer();
                    time = 0;
                }
            }
        });

和doAsynchronousTask将其作为字段并取消对stopTimer()的任务。

public void stopTimer() {
    doAsynchronousTask.cancel();
}

然后它运作正常。

答案 1 :(得分:0)

来自Javadocs:

  

cancel():终止此计时器,丢弃当前计划的任何任务。 [...]一旦计时器终止,其执行线程将正常终止,并且不再安排任何任务。

  计划(任务任务,长时间延迟)
  抛出:
  IllegalStateException - 如果已安排或取消任务,则取消计时器或终止计时器线程。

所以基本上,你的班级告诉你,由于计时器已被取消,它无法完成设定的任务。您可以尝试的是让计时器休眠直到再次按下按钮,而不是完全取消它。

答案 2 :(得分:0)

取消计时器后;由于线程已停止,因此无法重新启动。
请参阅链接:
Pause the timer and then continue it
您必须以某种方式维护状态并使用当前值重新创建计时器

答案 3 :(得分:0)

你需要一个异步任务它是一个类,所以你可以扩展它。公共类callAsynchronousTask扩展了异步任务 而GetMsgs performBackgroundTask = new GetMsgs();                             // PerformBackgroundTask这个类是扩展异步任务栏进入后台方法

的类

答案 4 :(得分:0)

在callAsynchronousTask中初始化你的计时器对象,如下所示。

public void callAsynchronousTask(){         final Handler handler = new Handler();

    TimerTask doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    try {
                        Log.e("Timer is work", "Timer is work");
                        //GetMsgs performBackgroundTask = new GetMsgs();
                        // PerformBackgroundTask this class is the class that extends AsynchTask
                        //performBackgroundTask.execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer=new Timer();
    timer.schedule(doAsynchronousTask, 0, 1000*10); //execute in every 50000 ms
}

同时修改你的in块,因为它正在执行条件。

使用布尔标志而不是int

 boolean isTimerRunning;

  if (!isTimerRunning) {
            callAsynchronousTask();
            isTimerRunning=true;
        }

       else (isTimerRunning) {
            stopTimer();
            isTimerRunning=false;
      }