-2

(根据请求更新文本)我是一名新的 Android 程序员,我正在开发一个简单的秒表程序。我对 c++ 有一些经验,但很少使用 java 或 xml,android 两者都使用,因此我在这里。我的问题与java方面有关。

我有两个问题。当我单击停止按钮时,我的程序可以更新经过的时间,但我想添加的是一个动态更新的文本框,其中包含经过的时间。我试图创建一个 while 循环,它只会运行时间,直到我单击停止,但它忽略了停止按钮并被困在 while 循环中,因为我不知道如何告诉它停止。也许解决这个问题的更好方法是 runnable。

我的第二个问题是,它根本不显示该 while 循环中的时间,即使我知道就格式而言我所拥有的内容是正确的。所以我的问题是,如果计算机没有被困在那个 while 循环中,这会消失吗?

我意识到我所说的一切都不是很清楚,也许有人可以在某处向我指出这种事情的一个很好的简单解释?我没有包含我的代码,因为它不是我的代码中的错误,我只是不知道该怎么做。

4

2 回答 2

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; }
        }
    }
}
于 2013-06-18T19:30:47.337 回答
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 接口。

于 2013-06-18T19:30:58.530 回答