19

私の Android アプリケーションには、経過時間を測定するタイマーがあります。100 ミリ秒ごとに、「スコア: 10 時間: 100.10 秒」のようなテキストで TextView を更新します。しかし、TextView は最初の数回しか更新されないことがわかりました。アプリケーションは依然として応答性が高いですが、ラベルは更新されません。.invalidate() を呼び出そうとしましたが、まだ機能しません。これを修正する方法があるかどうか、または使用するより良いウィジェットがあるかどうかはわかりません。

これが私のコードの例です:

float seconds;
java.util.Timer gametimer;
void updatecount() { TextView t = (TextView)findViewById(R.id.topscore);
t.setText("Score: 10 - Time: "+seconds+" seconds");
t.postInvalidate();
}
public void onCreate(Bundle sis) {
... Load the UI, etc...
  gametimer.schedule(new TimerTask() { public void run() {
     seconds+=0.1; updatecount();
} }, 100, 100);
}
4

4 に答える 4

19

一般的な解決策は、代わりに UI スレッドで実行される android.os.Handler を使用することです。ワンショット コールバックしか実行しないため、コールバックが呼び出されるたびに再度トリガーする必要があります。しかし、それは十分に使いやすいです。このトピックに関するブログ投稿は、数年前に書かれました。

http://android-developers.blogspot.com/2007/11/stitch-in-time.html

于 2009-11-26T16:58:28.493 に答える
2

私が考えているのは、UI スレッドから外れているということです。すべての画面更新を処理する単一の「ルーパー」スレッドがあります。「invalidate()」を呼び出そうとしても、このスレッドにいない場合は何も起こりません。

代わりに、ビューで「postInvalidate()」を使用してみてください。現在の UI スレッドにいないときにビューを更新できます。

詳細はこちら

于 2009-02-07T03:30:23.100 に答える
1

以下のコードを使用して、TextView で時間を設定します

public class MyCountDownTimer extends CountDownTimer {
        public MyCountDownTimer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {

            ExamActivity.this.submitresult();
        }

        @Override
        public void onTick(long millisUntilFinished) {

            long millis = millisUntilFinished;

            int seconds = (int) (millis / 1000) % 60;
            int minutes = (int) ((millis / (1000 * 60)) % 60);
            int hours = (int) ((millis / (1000 * 60`enter code here` * 60)) % 24);

            String ms = String
                    .format("%02d:%02d:%02d", hours, minutes, seconds);
            txtimedisplay.setText(ms);
        }
    }
于 2014-12-19T14:00:02.177 に答える
0

毎秒テキストを変更する方法がもう 1 つあります。これはValueAnimator。これが私の解決策です:

  long startTime = System.currentTimeMillis();
  ValueAnimator animator = new ValueAnimator();
            animator.setObjectValues(0, 1000);
            animator.setDuration(1000);
            animator.setRepeatCount(ValueAnimator.INFINITE);
            animator.addListener(new AnimatorListenerAdapter() {

                @Override
                public void onAnimationStart(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                   yourTextView.setText(text);
                }

                @Override
                public void onAnimationRepeat(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                    yourTextView.setText(text);
                }
            });
            animator.start();
于 2016-11-14T12:45:12.373 に答える