java - 停止和启动计时器

标签 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)
    ...

我不知道为什么它不起作用,请帮忙。低于我的类(class)

我的类(class)

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

最佳答案

按如下方式更改 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();
}

然后就可以正常工作了。

关于java - 停止和启动计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263573/

相关文章:

java - 实现 IP 网关(用 Java?)

java - 如何使用 github api 检索 repo 的所有贡献者

java - 允许依赖项中的类从我的项目的类路径加载测试资源

c#-4.0 - 在 VS 2010 中向 Windows 服务添加 System.Threading.Timer

python - 在Python中使用线程更改全局变量

java - 将值插入 mysql 表的更有效方法

java - 如何在 Android 中将调用转移到语音邮件?

java - 使用 ImageLoader 时出错,提示其未初始化

android - 在同一应用程序中同时使用浅色和深色复选框

java - 如何将用户字符串拉入timer.postDelayed