2009-02-07 31 views
17

Android uygulamam için ne kadar zaman geçtiğini ölçen bir zamanlayıcı var. Hiç 100 milisaniyede "Puan: 10 Zaman: 100,10 saniye" gibi bir metinle TextView'umu güncellerim. Ancak, TextView sadece ilk birkaç kez güncellemeleri buluyorum. Uygulama hala çok duyarlı, ancak etiket güncellenmeyecek. .invalidate() aramayı denedim, ancak hala çalışmıyor. Bunu düzeltmenin bir yolu olup olmadığını veya kullanmak için daha iyi bir widget olup olmadığını bilmiyorum.Android TextView Zamanlayıcısı

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

cevap

18

genel çözümü UI iş parçacığı içinde çalıştığı yerine android.os.Handler kullanmaktır. Sadece tek çekimde geri arama yapar, bu yüzden geri aranmanız her çağrıldığında tekrar tetiklemeniz gerekir. Ama kullanmak için yeterince kolay. Bu konuyla ilgili bir blog yayını birkaç yıl önce yazılmış: Kodun altında

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

+0

Bu bağlantı için teşekkür ederiz. Bu sayfadaki kod, TextView tabanlı zamanlayıcımla mükemmel bir şekilde çalıştı. – RyanM

2

Ne oluyor düşünüyorum UI iş parçacığı kapalı düşüyoruz: İşte

benim kod örneğidir. Tüm ekran güncellemelerini işleyen tek bir "looper" iş parçacığı vardır. "Invalidate()" yi çağırmaya çalışırsanız ve bu iş parçasında değilseniz, hiçbir şey olmaz.

Görünümünüzde "postInvalidate()" kullanmayı deneyin. Geçerli kullanıcı arayüzü işinde olmadığınızda bir görünümü güncellemenize izin verir.

diğer bilgiler here

+0

Yine de çalışmıyor - ilk kez güncellendi, böylece çalışmasını biliyorum ama bundan sonra güncellenmiyor. Yine de teşekkürler Isaac. –

+0

Eğer bir kod pasajı göndermek istiyorsanız bir göz atacağım – haseman

+0

Mesajıma bazı örnek kod ekledim - teşekkürler! –

0

Kullanım TextView saati ayarlamak için

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

metni her saniye değiştirmek için bir yol daha var; Bu ValueAnimator. İşte benim çözümüm:

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