Android 文本视图计时器

Posted

技术标签:

【中文标题】Android 文本视图计时器【英文标题】:Android TextView Timer 【发布时间】:2010-10-06 02:04:48 【问题描述】:

对于我的 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);

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您提供此链接。该页面上的代码与我的基于 TextView 的计时器完美配合。【参考方案2】:

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

尝试在您的视图上使用“postInvalidate()”。当您不在当前 UI 线程中时,它可以让您更新视图。

更多信息here

【讨论】:

它仍然不工作 - 它第一次更新,所以我知道它工作,但之后不更新。无论如何,谢谢,艾萨克。【参考方案3】:

使用下面的代码在 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);
        
    

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Android 文本视图计时器的主要内容,如果未能解决你的问题,请参考以下文章

24 小时倒计时计时器,带有三个单独的文本视图,分别显示小时、分钟、秒

如何在android的状态栏上显示倒数计时器,如时间显示?

SwiftUI:具有计时器样式的文本在提供的日期更改后不会更新

视图未在 Android 的相对布局中显示 [重复]

Android零基础入门第60节:日历视图CalendarView和定时器Chronometer

从ArrayAdapter每毫秒更新Android ListView中的一行