【问题标题】:Stop and start timer停止和启动计时器
【发布时间】:2015-07-07 08:32:46
【问题描述】:

对不起我的英语。我有计时器,如果我点击计时器打开,如果我再次点击计时器关闭。但我的计时器只开了一次。如果我再次点击(关闭计时器)我有这样的异常:

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

【问题讨论】:

    标签: java android timer


    【解决方案1】:

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

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

    然后它就可以正常工作了。

    【讨论】:

      【解决方案2】:

      来自 Javadocs:

      cancel() :终止此计时器,丢弃任何当前计划的任务。 [...]一旦计时器终止,它的执行线程就会优雅地终止,并且不能在其上安排更多任务。

      调度(任务任务,长时间延迟)
      抛出:
      IllegalStateException - 如果任务已经安排或取消,定时器被取消,或定时器线程终止。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您需要一个异步任务,它是一个类,以便您可以扩展它。公共类 callAsynchronousTask 扩展异步任务 和 GetMsgs performBackgroundTask = new GetMsgs(); // PerformBackgroundTask 这个类是扩展Async Taskbar进入do in background方法的类

          【讨论】:

            【解决方案5】:

            在 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 块,因为它同时执行 if 条件。

            使用布尔标志而不是 int

             boolean isTimerRunning;
            
              if (!isTimerRunning) {
                        callAsynchronousTask();
                        isTimerRunning=true;
                    }
            
                   else (isTimerRunning) {
                        stopTimer();
                        isTimerRunning=false;
                  }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-01-31
              • 1970-01-01
              相关资源
              最近更新 更多