使用计时器在Java中创建通用任务

时间:2015-01-10 11:42:50

标签: java android timer generic-programming

在Android游戏中,我问玩家一个问题,我想在不同的时间长度后给出不同的提示,如果玩家未能及时回答,最后给出答案。

问题,提示和延迟时间是从JSON格式的外部文件中读取的。

我想为每个提示设置一个计时器。在JavaScript中,我可以创建一个带闭包的泛型方法,如下所示:

JavaScript代码

<body>
<p id="1">One</p>
<p id="2">Two</p>
<p id="3">Three</p>

<script>
var hints = [
  { id: 1, delay: 1000, text: "Hint 1" }
, { id: 2, delay: 2000, text: "Hint 2" }
, { id: 3, delay: 3000, text: "Hint 3" }
]

hints.map(setTimeoutFor)

function setTimeoutFor(hint) {
  setTimeout(showHint, hint.delay)

  function showHint() {
    element = document.getElementById(hint.id)
    element.innerHTML = hint.text
  }
}
</script>

在Java中,我知道我可以为每个提示使用单独的方法,如下所示:

Java代码

import java.util.Timer;
import java.util.TimerTask;

String hint1 = "foo";
CustomType location1 = customLocation;
Timer timer1;
TimerTask task1;

void createTimer1(delay) {
    timer1 = new Timer();
    task1 = new TimerTask() {
        @Override
        public void run() {
            giveHint1();
        }
    };
    timer1.schedule(task1, delay);
}

void giveHint1() {
  timer1.cancel()
  giveHint(hint1, location1);
}

void giveHint(String hint, CustomType location) {
  // Code to display hint at the given location
}

这不优雅。我可以在Java中使用哪些技术来实现这种通用,以便我可以对所有提示使用相同的方法?

1 个答案:

答案 0 :(得分:1)

为什么每个提示都需要单独的方法?您可以使用方法参数,如下所示:

// "final" not required in Java 8 or later
void createTimer(int delay, final String hint, final Point location) {
    timer = new Timer();
    task = new TimerTask() {
        @Override
        public void run() {
            giveHint(hint, location);
        }
    };
    timer.schedule(task, delay);
}

void giveHint(String hint, CustomType location) {
  // Code to display hint at the given location
}