Android 定时器延迟和重置
Android Timer delay and reset
我确定这里某处也有类似的问题,但我似乎找不到它。
这是我正在尝试做的事情。
假设我已连接到服务器,如果用户在过去 5 分钟内未拨打任何电话,我想断开连接。但是,即使只打了一个电话,5 分钟的计时器也会重置,倒计时到 5 会再次开始..
这看起来很简单,但我是 Android 的新手,正在尝试解决问题..
提前致谢!
======= 编辑
下面是我想要执行的代码示例。
try {
client.publish(topic, message);
success = true;
if(topic.equals("response")) {
// need to reset my 5 min timer here
// but if 5 mins go by and this try/catch isn't called again,
// need to call the client.disconnect() method here
} else {
client.disconnect();
}
} catch (Exception e) {
success = false;
e.printStackTrace();
}
所以基本上每次调用服务器时都会调用它。
我需要在 if 语句中实现什么?
================= 回答后编辑 @Saeed Mashhadi 的回答
请看下面的日志输出。所以起初,它运作良好。当 disconnectCounter
每秒增加一个时,我又打了一个电话。
在那次调用之后,disconnectCounter
再次从 1 开始,但开始每秒增加 2。左边有时间戳。你能告诉我为什么会这样吗?
11-05 15:50:59.395 13253-13521/ ~~ disconnectCounter - 1
11-05 15:51:00.404 13253-13521/ ~~ disconnectCounter - 2
11-05 15:51:01.401 13253-13521/ ~~ disconnectCounter - 3
11-05 15:51:02.403 13253-13521/ ~~ disconnectCounter - 4
11-05 15:51:03.394 13253-13521/ ~~ disconnectCounter - 5
11-05 15:51:04.400 13253-13521/ ~~ disconnectCounter - 6
11-05 15:51:05.396 13253-13521/ ~~ disconnectCounter - 7
11-05 15:51:06.402 13253-13521/ ~~ disconnectCounter - 8
11-05 15:51:07.408 13253-13521/ ~~ disconnectCounter - 9
11-05 15:51:08.399 13253-13521/ ~~ disconnectCounter - 10
11-05 15:51:09.407 13253-13521/ ~~ disconnectCounter - 11
11-05 15:51:10.406 13253-13521/ ~~ disconnectCounter - 12
11-05 15:51:11.401 13253-13521/ ~~ disconnectCounter - 13
11-05 15:51:12.409 13253-13521/ ~~ disconnectCounter - 14
......
11-05 15:51:27.498 13253-13253/ ~~~~~~~~~~~ USER CALL ~~~~~~~~~~~
11-05 15:51:28.399 13253-13521/ ~~ disconnectCounter - 1
11-05 15:51:28.514 13253-13521/ ~~ disconnectCounter - 2
11-05 15:51:29.398 13253-13521/ ~~ disconnectCounter - 3
11-05 15:51:29.515 13253-13521/ ~~ disconnectCounter - 4
11-05 15:51:30.403 13253-13521/ ~~ disconnectCounter - 5
11-05 15:51:30.519 13253-13521/ ~~ disconnectCounter - 6
11-05 15:51:31.401 13253-13521/ ~~ disconnectCounter - 7
11-05 15:51:31.512 13253-13521/ ~~ disconnectCounter - 8
11-05 15:51:32.398 13253-13521/ ~~ disconnectCounter - 9
11-05 15:51:32.510 13253-13521/ ~~ disconnectCounter - 10
11-05 15:51:33.398 13253-13521/ ~~ disconnectCounter - 11
11-05 15:51:33.506 13253-13521/ ~~ disconnectCounter - 12
11-05 15:51:34.400 13253-13521/ ~~ disconnectCounter - 13
11-05 15:51:34.504 13253-13521/ ~~ disconnectCounter - 14
......
谢谢!!
由于你没有代码,我给你一个高水平的答案。您需要保留上次连接的时间戳和偏移量。您还需要不时检查时间戳 + offest 是否低于实际时间戳。并针对每个请求更新最后一个请求时间戳。
你可以这样做:
Timer timer;
...
try {
client.publish(topic, message);
success = true;
if(topic.equals("response")) {
// If try/catch is called, counter resets
disconnectCounter=0;
timer=new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Increase counter every second
disconnectCounter++;
Log.i("counter", disconnectCounter + "");
// If 5 mins go by and this try/catch isn't called
// again, disconnect
if(disconnectCounter==300){ // 300=5*60
client.disconnect();
timer.cancel();
disconnectCounter=0;
}
}
}, 1000, 1000);
} else {
client.disconnect();
disconnectCounter=0;
}
} catch (Exception e) {
success = false;
timer.cancel();
disconnectCounter=0;
e.printStackTrace();
}
我确定这里某处也有类似的问题,但我似乎找不到它。
这是我正在尝试做的事情。
假设我已连接到服务器,如果用户在过去 5 分钟内未拨打任何电话,我想断开连接。但是,即使只打了一个电话,5 分钟的计时器也会重置,倒计时到 5 会再次开始..
这看起来很简单,但我是 Android 的新手,正在尝试解决问题..
提前致谢!
======= 编辑
下面是我想要执行的代码示例。
try {
client.publish(topic, message);
success = true;
if(topic.equals("response")) {
// need to reset my 5 min timer here
// but if 5 mins go by and this try/catch isn't called again,
// need to call the client.disconnect() method here
} else {
client.disconnect();
}
} catch (Exception e) {
success = false;
e.printStackTrace();
}
所以基本上每次调用服务器时都会调用它。
我需要在 if 语句中实现什么?
================= 回答后编辑 @Saeed Mashhadi 的回答
请看下面的日志输出。所以起初,它运作良好。当 disconnectCounter
每秒增加一个时,我又打了一个电话。
在那次调用之后,disconnectCounter
再次从 1 开始,但开始每秒增加 2。左边有时间戳。你能告诉我为什么会这样吗?
11-05 15:50:59.395 13253-13521/ ~~ disconnectCounter - 1
11-05 15:51:00.404 13253-13521/ ~~ disconnectCounter - 2
11-05 15:51:01.401 13253-13521/ ~~ disconnectCounter - 3
11-05 15:51:02.403 13253-13521/ ~~ disconnectCounter - 4
11-05 15:51:03.394 13253-13521/ ~~ disconnectCounter - 5
11-05 15:51:04.400 13253-13521/ ~~ disconnectCounter - 6
11-05 15:51:05.396 13253-13521/ ~~ disconnectCounter - 7
11-05 15:51:06.402 13253-13521/ ~~ disconnectCounter - 8
11-05 15:51:07.408 13253-13521/ ~~ disconnectCounter - 9
11-05 15:51:08.399 13253-13521/ ~~ disconnectCounter - 10
11-05 15:51:09.407 13253-13521/ ~~ disconnectCounter - 11
11-05 15:51:10.406 13253-13521/ ~~ disconnectCounter - 12
11-05 15:51:11.401 13253-13521/ ~~ disconnectCounter - 13
11-05 15:51:12.409 13253-13521/ ~~ disconnectCounter - 14
......
11-05 15:51:27.498 13253-13253/ ~~~~~~~~~~~ USER CALL ~~~~~~~~~~~
11-05 15:51:28.399 13253-13521/ ~~ disconnectCounter - 1
11-05 15:51:28.514 13253-13521/ ~~ disconnectCounter - 2
11-05 15:51:29.398 13253-13521/ ~~ disconnectCounter - 3
11-05 15:51:29.515 13253-13521/ ~~ disconnectCounter - 4
11-05 15:51:30.403 13253-13521/ ~~ disconnectCounter - 5
11-05 15:51:30.519 13253-13521/ ~~ disconnectCounter - 6
11-05 15:51:31.401 13253-13521/ ~~ disconnectCounter - 7
11-05 15:51:31.512 13253-13521/ ~~ disconnectCounter - 8
11-05 15:51:32.398 13253-13521/ ~~ disconnectCounter - 9
11-05 15:51:32.510 13253-13521/ ~~ disconnectCounter - 10
11-05 15:51:33.398 13253-13521/ ~~ disconnectCounter - 11
11-05 15:51:33.506 13253-13521/ ~~ disconnectCounter - 12
11-05 15:51:34.400 13253-13521/ ~~ disconnectCounter - 13
11-05 15:51:34.504 13253-13521/ ~~ disconnectCounter - 14
......
谢谢!!
由于你没有代码,我给你一个高水平的答案。您需要保留上次连接的时间戳和偏移量。您还需要不时检查时间戳 + offest 是否低于实际时间戳。并针对每个请求更新最后一个请求时间戳。
你可以这样做:
Timer timer;
...
try {
client.publish(topic, message);
success = true;
if(topic.equals("response")) {
// If try/catch is called, counter resets
disconnectCounter=0;
timer=new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Increase counter every second
disconnectCounter++;
Log.i("counter", disconnectCounter + "");
// If 5 mins go by and this try/catch isn't called
// again, disconnect
if(disconnectCounter==300){ // 300=5*60
client.disconnect();
timer.cancel();
disconnectCounter=0;
}
}
}, 1000, 1000);
} else {
client.disconnect();
disconnectCounter=0;
}
} catch (Exception e) {
success = false;
timer.cancel();
disconnectCounter=0;
e.printStackTrace();
}