Androidの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);
}
解決
一般的な解決策は、UIスレッドで実行する代わりandroid.os.Handlerを使用することです。これは、ワンショットのコールバックを行うだけなので、あなたは再びあなたのコールバックが呼び出されるたびにそれをトリガーする必要があります。しかし、使用するのに十分に簡単です。このトピックに関するブログの記事は、数年前に書かれたます:
http://android-developers.blogspot.com/ 11分の2007 /ステッチ・イン・time.htmlする
他のヒント
私は何が起こっていると思うことは、あなたがUIスレッドから落下しています。すべての画面の更新を処理する単一の「ルーパー」のスレッドがあります。あなたは呼んで「無効()」とあなたは、このスレッドには何も起こりませんしていない。
しようとすると、の代わりに、ビューの "postInvalidateを()" を使用してみてください。それはあなたが現在のUIスレッドでいないときにビューを更新してもらおう。
詳細情報ここの
の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);
}
}
2番目のテキストそれぞれを変更するもう一つの方法があります。これは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();