(每个请求更新文本)我是一名新的Android程序员,我正在制作一个简单的秒表程序。我有一些c ++的经验但很少有java或xml,其中android使用两者,因此我在这里。我的问题与java方面有关。
我有两个问题。我的程序用于更新单击停止按钮时经过的时间,但我想添加的是动态更新的文本框,其中包含时间。我试图创建一个while循环,只运行时间直到我点击停止但它忽略了停止按钮并被困在while循环中因为我不知道如何告诉它停止。或许更好的方法是可以运行。
我的第二个问题是它在while循环中根本不显示时间,即使我知道我的格式是正确的。所以我的问题是,如果计算机没有被困在那个循环中,这会消失吗?
我意识到我所说的一切都不是很清楚,也许有人可以指点我对这种事情进行简单的解释?我没有包含我的代码,因为它不是我的代码中的错误,我只是不知道该怎么做。
答案 0 :(得分:0)
我假设您使用的是Java(因为您提到了Runnable
)。如果是这种情况,你可以这样做:
public class MyClockRunnable implements Runnable {
public bool running = true;
public void run() {
while(running) {
// Update the time and other things you need done here
Thread.sleep(1000);
}
}
}
然后,从调用类:
public class AppController {
public AppController() {
//on start call
// MyClockRunnable clock = new MyClockRunnable();
// new Thread(clock).start();
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { clock.running = false; }
}
}
}
答案 1 :(得分:0)
不需要循环 - 此任务的通常做法是使用计时器并将所有事件驱动。您通常会有一个“经过时间的计时器”来测量经过的时间,以及一个跟踪时间间隔的计时器,并在每次经过该时间间隔时触发回调。由于您尚未指定编程语言和框架,因此我将使用一些伪代码:
void updateUI() {
textbox.setText(et.elapsedTime());
}
void stop() {
t.stop();
textbox.setText("Total time was " + et.elapsedTime());
et.stop;
}
void start() {
et.start();
t.start();
}
ElapsedTimer et;
Timer t(200, updateUI); // timer with interval 200 msec updateUI()
因此,您基本上将开始按钮绑定到启动功能,将停止按钮绑定到停止功能,并且在计时器运行时,您将定期更新UI中的已用时间。点击停止后,您将获得最后一次。
请注意,您也可以异步执行此操作,但线程间通信通常排队并且速度足够慢以影响更精确的测量。
编辑:刚刚注意到Java被添加到标签中,无论如何都会留下这个答案供参考。
编辑2:我不知道Java如何实现Runnable,但是我在Qt中使用的Runnable在将数据频繁传输到GUI所在的主线程时并不是特别好。基本上,Runnable的想法是启动一个异步任务,只有在完成时才会被告知,线程之间只有极少量的“信号”。特别是在这种特定情况下,其中传输的值是时间的指示,这可能非常不准确,直到在队列中到达以进行显示。这就是为什么我不建议为该特定任务使用Runnable接口。