我编写了一个连接到服务器并向他发送 ping 命令的应用程序,服务器使用 pong 命令进行应答。
我想实现连接超时机制。我认为它将如下:
另外,我想优化内存。所以,不要在我每次发送 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/