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

标签 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 中使用什么技术来使其通用,以便我可以对所有提示使用相同的方法?

最佳答案

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

// "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
}

关于java - 使用计时器在 Java 中创建通用任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27875845/

相关文章:

java - 定时器:周期小于一毫秒

java - JPA CriteriaBuilder 加入额外的 ON 子句参数(谓词)

java - 原子移动和同时运行它的许多进程

java - 数字太长无法传递给 Random()?

Android - 从 Webview 调用 Java

android - BroadcastReceiver 和 PHONE_STATE 不起作用

android - 在 Fragment 中实现接口(interface)

javascript - 如何跳过 setInterval 函数的第一次延迟?

java - 为什么使用 Dataset 的 PageRank 作业比 RDD 慢得多?

ios - 当应用程序进入后台或用户退出应用程序时如何停止计时器