2009-02-07 113 views
17

對於我的Android應用程序存在測量多少時間已經過去了一個計時器。在100毫秒內,我用一些文本更新我的TextView,例如「Score:10 Time:100.10 seconds」。但是,我發現TextView只是前幾次更新。該應用程序仍然非常靈敏,但標籤不會更新。我試圖調用.invalidate(),但它仍然不起作用。我不知道是否有一些方法可以解決這個問題,或者使用更好的小部件。的Android的TextView計時器

這裏是我的代碼示例:

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); 
} 

回答

2

我認爲正在發生的事情是你脫落的UI線程。有一個單獨的「looper」線程可處理所有屏幕更新。如果你試圖調用「invalidate()」,並且你不在這個線程中,則什麼都不會發生。

嘗試使用 「postInvalidate()」 對你的看法吧。當你不在當前的UI線程中時,它會讓你更新視圖。

更多信息here

+0

它仍然不起作用 - 它第一次更新,所以我知道它的工作,但之後不更新。無論如何,謝謝艾薩克。 – 2009-02-07 17:18:32

+0

如果你想發佈代碼snippit我會去看看 – haseman 2009-02-07 19:20:22

0

使用下面的代碼來設置時間上的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); 
     } 
    } 
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();