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 小时倒计时计时器,带有三个单独的文本视图,分别显示小时、分钟、秒
SwiftUI:具有计时器样式的文本在提供的日期更改后不会更新