PostDelayed功能越来越快

时间:2017-07-01 19:38:10

标签: java android postdelayed

所以我有一个蛇应用程序,我试图让它在新的运行之前等待屏幕触摸。

我认为最好的方法是让代码停止更新蛇并继续UI更新。所以我有一个正在运行的游戏状态和一个丢失的游戏状态。

当我玩第一场比赛时,它应该是应该的,但是当我死了并且过去时它变得越来越快。

我认为这是我在Running和Lost中调用postDelay方法的方式。但是,如果我只是在跑步中称它为迷失而只是再次运行游戏而没有任何暂停,它会顺利运行。

private void startUpdateHandler(){
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            if (gameEngine.getCurrentGameState() == GameState.running){
                gameEngine.Update();
                handler.postDelayed(this, updateDelay);
            }

            if (gameEngine.getCurrentGameState() == GameState.lost){
                if (trial) {
                    onGameLost();
                    trial = false;
                }
                if (touch){
                    gameEngine.initgame();
                    gameEngine.setToRunning();
                    trial = true;
                }
                handler.postDelayed(this, updateDelay);
            }

            snakeView.setSnakeViewMap(gameEngine.getMap());
            snakeView.invalidate();
        }
    }, updateDelay);
}

我可能没有正确的postDelayed方法,我已经尝试搜索暂停代码并等待点击的方法。但这刚刚打破了我的代码。如果我在你死亡和重新开始之间没有任何延迟,那么代码就可以工作了。

stackoverflow新手,所以如果我的问题不好,我会尝试修复它!

*****编辑******

我自己解决了这个问题,我把handler.postDelayed(this,updateDelay);在运行功能的后面。我看到当我有3000毫秒的延迟时,每次我死了它每次移动时跳了一个额外的时间,当我有3个handler.postDelayed(这,updateDelay);每次搬家,它都会跳出2倍。

所以我得出结论,如果我写了超过1次的后延迟,它会随着时间的推移而堆积起来。不知道为什么,但它现在完美无缺,我很感激任何可以解释这一点的人!

1 个答案:

答案 0 :(得分:0)

我不确定你的内部功能是如何运作的,但是你可能有改变状态的方法,因为你有两个非版本的调用,它可能会多次调用处理程序。我也觉得这会不断添加到堆栈中,最终会导致溢出错误。您可以使用开关或if else来解决第一个问题。

您可能还需要考虑使用类似实现的间隔,然后在必要时更新间隔。看看Android的Timer