19

对于我的 Android 应用程序,有一个计时器可以测量经过了多少时间。每 100 毫秒,我都会用一些文本更新我的 TextView,例如“分数:10 时间:100.10 秒”。但是,我发现 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

一般的解决方案是使用 android.os.Handler 代替它在 UI 线程中运行。它只执行一次性回调,因此每次调用回调时都必须再次触发它。但它很容易使用。几年前写了一篇关于这个主题的博客文章:

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

于 2009-11-26T16:58:28.493 回答
2

我认为正在发生的是你从 UI 线程上掉下来了。有一个处理所有屏幕更新的“looper”线程。如果您尝试调用“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

还有另一种每秒更改文本的方法;这是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 回答