Art*_*aev 6 android exception timer
我编写了一个连接到服务器的应用程序,并向他发送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();
}
Run Code Online (Sandbox Code Playgroud)
但是当我第二次尝试安排TimerTask时出现以下错误:
java.lang.IllegalStateException: TimerTask is scheduled already
at java.util.Timer.scheduleImpl(Timer.java:572)
at java.util.Timer.schedule(Timer.java:459)
Run Code Online (Sandbox Code Playgroud)
我不明白,因为我打电话cancel()给TimerTask.
请告诉我我做错了什么.谢谢你的回答!
Shl*_*blu 11
TimerTask.cancel()不一定会阻止任务的执行.根据SDK文档,它会true在实际阻止执行时返回,false否则返回.
看起来像第一次true返回时你的代码会发生什么,而不是第二次,导致IllegalStateException在之后调用时抛出Timer.schedule().
您应该检查TimerTask.cancel()的返回代码,并重新创建您TimerTask在false返回:在TimerTask被烧毁,无法在该阶段被重用.
| 归档时间: |
|
| 查看次数: |
13480 次 |
| 最近记录: |