2

基本的にストップウォッチであり、ラップタイムを表示するブラックベリー アプリを作成しようとしています。まず、ストップウォッチ機能を最適な方法で実装しているかどうかわかりません。00:00 から始まる「時計」を表示する LabelField (_myLabel) があります。次に、開始ボタンを押すと、毎秒 _myLabel フィールドが最後の更新から経過した秒数で更新されます (1 だけ増加する必要がありますが、遅延が発生し、数値がスキップされる場合があります)。私はそれを行う別の方法を考えることはできません-そして、私はGUI開発とスレッドに慣れていないので、それが理由だと思います.

編集:ストップウォッチと呼ばれるものは次のとおりです。

_timer = new Timer();
_timer.schedule(new MyTimerTask(), 250, 250);  

TimerTask は次のとおりです。

class MyTimerTask extends TimerTask {
long currentTime;
long startTime = System.currentTimeMillis();

public void run() {
synchronized (Application.getEventLock()) {
currentTime = System.currentTimeMillis();
long diff = currentTime - startTime;
long min = diff / 60000;
long sec = (diff % 60000) / 1000;
String minStr = new Long(min).toString();
String secStr = new Long(sec).toString();

if (min < 10)
 minStr = "0" + minStr;
if (sec < 10)
 secStr = "0" + secStr;

 _myLabel.setText(minStr + ":" + secStr);  
timerDisplay.deleteAll();
timerDisplay.add(_timerLabel);
 }
 }
}

とにかく、ストップウォッチを停止すると、ラップタイム データの履歴テーブルが更新されます。このリストが長くなると、タイマーが低下し始めます。スクロールしようとすると、非常に悪くなります。

ストップウォッチを実装するより良い方法はありますか?

4

1 に答える 1

3

いくつかのヒントを次に示します。

  • ラベルの更新に使用された最後の「秒」値を追跡し、新しく計算された「秒」値が同じ場合はすぐに実行ループを終了します。そうでない場合は、同じ値で UI を不必要に更新し、すべてが遅くなります。下
  • 実行ループで同期を削除し、UI を変更するコード (setText 呼び出し) を UiApplication.getUiApplication.invokeLater() 呼び出し (匿名の Runnable を使用) に入れるだけです。
  • 画面または管理者からラベルを削除したり再追加したりしないでください。 setText() を呼び出すだけで更新する必要があります。更新されない場合は、フィールドで invalidate() を呼び出すと、再描画されます。
  • コードを最適化し、実際の UI 描画の量を最小限に抑えたので、timertask の間隔を 50ms などの低い値に設定しても問題ありません。これにより、タイマーの更新がスムーズになります。

高速な UI を作成する上で覚えておくべき最も重要なことは、必要なときにのみ UI を更新し、変更が必要なフィールドのみを更新することです。deleteAll() のようなメソッドを呼び出すと、画面全体またはマネージャーの更新が非常に遅くなります。

于 2010-03-09T07:57:04.637 に答える