2013-03-15 15 views
14

Android uygulamasında bir TextView farklı renkleri yanıp sönen bir animasyonum var. Bunu uygulamak için bir TimerTask, Timer ve Runnable yöntemi kullandım. Yapmam gereken şey, kullanıcı bu animasyon sırasında uygulamayı onPause() uygulamasında bıraktığında ve kullanıcı onResume() uygulamasında uygulamaya döndüğünde iş parçacığı kaldığında durur. Aşağıda, uyguladığım kod var, ancak çalışmıyor (onPause() ve onResume() parçaları) ve nedenini anlamıyorum. Benzer konularda birkaç yazı daha okudum, ama durumumda ne yapacağımı anlamama yardımcı olmadılar. TimerTasks'ın eski olduğunu ve muhtemelen bir ExecutorService yöntemini kullanmam gerektiğini okudum; Bu işlevi nasıl uygulayacağım belli değil. Bir TimerTask iptal edildikten sonraBir TimerTask/Timer nasıl durdurulur ve devam ettirilir

...timerStep5 = new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
       if (b5) { 
        cashButton2SignalText.setBackgroundColor(Color.RED); 
        cashButton2SignalText.setTextColor(Color.WHITE); 
        b5=false; 
       } else { 
        cashButton2SignalText.setBackgroundColor(Color.WHITE); 
        cashButton2SignalText.setTextColor(Color.RED); 
        b5=true; 
       } 
       } 
      }); 
     } 
}; 

timer5.schedule(timerStep5,250,250); 

} 

public void onPause(){ 

    super.onPause(); 

    timerStep5.cancel(); 

} 

public void onResume(){ 

    super.onResume(); 

    timerStep5.run(); 

} 
+0

[Duraklatma/sürekli Java TimerTask sürdürme/durdurma ve başlatma?] Olası yinelenen (http://stackoverflow.com/questions/2098642/pausing-stopping-and-starting-resuming-java-timertask-continuously) – Gboy

cevap

12

, bu yeni bir örneğini oluşturmak zorunda, tekrar yayınlanamaz. Burada

Oku ayrıntıları:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor yeni kodu için tavsiye edilir, programlanan aralığından daha uzun zaman ayırdığınız istisnalar ve görev gibi durumlarda işler.

Ancak göreviniz için TimerTask yeterli olmalıdır.

+0

Tamam, bu yazıyı daha önce gördüm ve bununla karıştırdı; belki benim için bir şeyi açıklığa kavuşturabilirsiniz: Bir kullanıcı, uygulamanızı TimerTask etkinliği sırasında bırakabilir ve bu etkinliğe bir kereden fazla geri dönebilir. Bu, kullanıcı bu etkinlik sırasında ayrıldığında her zaman onResume() içinde yeni bir TimerTask örneği oluşturmak ve geri döndürmek zorunda kalacağım anlamına gelmez mi? – embersofadyingfire

+0

Soru: Bir kullanıcının bu eylemi bir an için bırakıp geri döndüğünü görmezden geldiysem ve TimerTask'ı duraklatmak ve sürdürmek için herhangi bir uygulama bırakmış olsaydım, ancak kullanıcı nihayet ileriye doğru hareket ettiğinde TimerTask'ı iptal etmek içinStop() üzerinde uygulandı. Başka bir aktivite, bu TimerTask etkinliği duraklatılırken bir tür bellek sızıntısına neden olur mu? – embersofadyingfire

+1

Herhangi bir bellek sızıntısı olacağını sanmıyorum, ancak kullanıcı arabiriminizin güncelleştirme görevinin hiçbir şey için arka planda çalışmasına izin vermek mantıklı değildir. Evet, anında TimerTask oluşturmalısınız ve tekrar kullanılamaz. Bu şekilde tasarlandı. (Ben iplik güvenliği için sanırım) Ayrıca onResume biraz sıkı döngü değil, bir nesne yaratmanın maliyeti ihmal edilebilir. –

2

İşte nasıl yaptım. PauseTimer boolean, duraklama nerede olursa olsun (belki de dinleyici dinleyicisi) ekleyin ve eğer doğruysa zamanlayıcıyı saymaz.

private void timer(){ 
    Timer timer = new Timer(); 
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer); 
    countTimer = 0; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String s_time = String.format("%02d:%02d:%02d", 
          countTimer/3600, 
          (countTimer % 3600)/60, 
          countTimer % 60); 
        tv_timer.setText(s_time); 
        if (!pauseTimer) countTimer++; 
       } 
      }); 
     } 
    }, 1000, 1000); 
} 
İlgili konular