【发布时间】:2014-05-14 07:31:47
【问题描述】:
我编写了一个连接到服务器并向他发送 ping 命令的应用程序,服务器用 pong 命令回答。
我想实现连接超时机制。我认为它会如下:
- 客户端发送 ping 并使用 timertask 和延迟启动计时器
- 当客户端收到 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()。
请告诉我我做错了什么。 谢谢你的回答!
【问题讨论】:
-
mLogoutTask.cancel();返回什么?另外,您是否尝试过不使用“内存优化”? -
第一次返回true,第二次返回false。
-
没有“内存优化”一切正常,
cancel总是返回 true -
好的,这足以确定我猜发生了什么(见下文)。