2010-07-12 18 views
7

Android uygulamasında periyodik bir görev yürütmem gerekiyor. Bu tam olarak neye ihtiyacım yok, ama bir sorun varAndroid sistem saatini değiştirmek zamanlayıcıları durdurur. Onları nasıl yeniden başlatabilirim?

final Handler guiHandler = new Handler(); 

// the task to run 
final Runnable myRunnable = new Runnable() { 

    @Override 
    public void run() { 
     doMyStuff(); 
    } 
}; 

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 

    @Override 
    public void run() { 
     guiHandler.post(myRunnable); 
    } 
}, 0, 30000); // run every 30 seconds 

: Ben emülatörü veya telefonda saatini değiştirmek durumunda, zamanlayıcı çalışmasını durdurur Şu anda böyle bir zamanlayıcı kullanın. Bu Zamanım değiştirdiğinizde günlüğünde görünür budur: zamanlayıcı yaklaşık

D/SystemClock( 331): Setting time of day to sec=1278920137 
W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument 

Hiçbir şey kesintiye uğramasına, ancak sistem saati değişti sonra açıkça artık çalışmaz. Uygulama çalışırken her zaman çalışmaya devam etmek için göreve ihtiyacım var.

Böyle durduğunda zamanlayıcıyı nasıl yeniden başlatabilirim? Şu anda çalışıp çalışmadığını kontrol etmek için Timer veya TimerTask'ta herhangi bir yöntem yoktur, bu yüzden ne zaman yeniden programlayacağınızı bilmiyorum. Herhangi bir fikir?

cevap

3

Bunu yapmanın birkaç yolu olduğunu düşünüyorum. Zamanlayıcıyı her iki durumda da kullanmazdım.

Görevinizi postDelayed bir çağrıda çalıştırmak için bir işleyiciyi kullanabilirsiniz. Göreviniz o zaman kendini işleyiciden kendi kendine yeniden kaydettirmek zorunda kalacaktı.

final int ONE_SECOND = 1000; // one second 
final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 
     ... // do some stuff 
     if (expression) { 
     handler.postDelayed(this, ONE_SECOND); 
     } 
    } 
}, ONE_SECOND); 

Bu, uygulamanızın canlı olduğu sırada çalışmayı sürdürecektir. Gecikmeli ücretin, Yürütülebilir alandaki son gönderim ücretini de ayarlayabilirsiniz. Bu şekilde başka bir Looper yaptığınız sürece yarı öngörülebilir. Ana iş parçacığının kullanılması, görevin ne olduğuna bağlı olarak uygun olabilir veya olmayabilir.

Ayrıca, daha kesin aralıklarla yinelenen görev görevlerine yönelik olan Bağlam arabirimi aracılığıyla erişebileceğiniz bir Alarm Yöneticisi de vardır. Kullanmak için biraz daha karmaşıktır, ancak RTC ve kalıcı tekrarlanabilir görevleri kullanmanın esnekliğini elde edersiniz. Örneğin, beklemedeki amaç, başka bir yerde dinleyebileceğiniz bir yayın niyetini ateşleyebilir. Örneğin; Bu pendingintent'i, özel Uygulama nesnesinin onCreate öğesinde oluşturabilir ve onTerminate() öğesindeki niyetini iptal edebilirsiniz.

+0

Bu, aradığım harika bir çözüm! Teşekkürler – JosephT

İlgili konular