-2

(リクエストごとにテキストを更新) 私は新しい Android プログラマーで、単純なストップ ウォッチ プログラムに取り組んでいます。私はc ++の経験がありますが、androidが両方を使用するjavaまたはxmlの経験はほとんどないため、ここにいます。私の質問は、Java の側面に関するものです。

2 つの問題があります。私のプログラムは、停止ボタンをクリックすると経過時間を更新するように機能しますが、追加したいのは、経過時間で動的に更新されるテキストボックスです。停止をクリックするまで時間を実行するwhileループを作成しようとしましたが、停止ボタンを無視し、停止するように指示する方法がわからないため、whileループに閉じ込められました。おそらく、これを行うためのより良い方法は、ランナブルです。

私の 2 番目の問題は、書式設定に関する限り、自分が持っているものが正しいことを知っていても、その 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 に答える