草庐IT

android - java.lang.IllegalStateException : TimerTask is scheduled already: Rationally using of Timer and TimerTask in Android 错误

coder 2023-11-30 原文

我编写了一个连接到服务器并向他发送 ping 命令的应用程序,服务器使用 pong 命令进行应答。

我想实现连接超时机制。我认为它将如下:

  • 客户端发送 ping 并使用 timertask 和 delay 启动计时器
  • 当客户端收到pong时,timertask被取消。

另外,我想优化内存。所以,不要在我每次发送 ping 命令时都重新创建 TimerTask。我尝试下面的代码:

private final Timer mSystemLogoutTimer = new Timer();
private final TimerTask mLogoutTask = new TimerTask() {

    @Override
    public void run() {
        mMessageInterface.onConnectionTimeout();
        cancel();
    }
};

private void ping() {
    sendRequest(RequestBuilder.formPing());
    mSystemLogoutTimer.schedule(mLogoutTask, CoreConst.PING_ANSWER_DELAY);
}

private void onPong() {
    mLogoutTask.cancel();
}

但是当我第二次尝试安排 TimerTask 时出现以下错误:

java.lang.IllegalStateException: TimerTask is scheduled already
at java.util.Timer.scheduleImpl(Timer.java:572)
at java.util.Timer.schedule(Timer.java:459)

我不明白,因为我在 TimerTask 上调用了 cancel()

请告诉我我做错了什么。 谢谢解答!

最佳答案

TimerTask.cancel() 不一定会阻止任务的执行。根据the SDK documentation , 它在实际阻止执行时返回 true,否则返回 false

看起来像这样,您的代码在第一次返回 true 时发生了什么,但在第二次返回时却没有,导致在调用 时抛出 IllegalStateException Timer.schedule() 紧随其后。

您应该检查 TimerTask.cancel() 的返回码,并在返回 false 时重新创建您的 TimerTask: TimerTask 被烧毁,无法在那个阶段重用。

关于android - java.lang.IllegalStateException : TimerTask is scheduled already: Rationally using of Timer and TimerTask in Android 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23648258/

有关android - java.lang.IllegalStateException : TimerTask is scheduled already: Rationally using of Timer and TimerTask in Android 错误的更多相关文章

随机推荐