gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:37:32 26 4
gpt4 key购买 nike

我编写了一个连接到服务器并向他发送 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com