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();
}