Android TextView Timer

时间:2009-02-07 00:35:11

标签: java android timer textview

对于我的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 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:2)

我认为发生的事情是你正在脱离UI线程。有一个“looper”线程可以处理所有屏幕更新。如果你试图调用“invalidate()”并且你不在这个线程上就不会发生任何事情。

请尝试在视图中使用“postInvalidate()”。当您不在当前的UI线程中时,它将允许您更新视图。

更多信息here

答案 2 :(得分: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);
        }
    }

答案 3 :(得分:0)

还有一种方法可以每秒更改一次文本;这是case 'GET_DATA_SUCCESS': let totalPrice = getTotalPrice(action.data); return Object.assign({}, state, { datas: action.data, cartTotal: totalPrice }); 。这是我的解决方案:

ValueAnimator