我想在我的應用程序中進行自動同步,每天晚上9點發生。我的方式這樣做:發出通知,每天下午9:00運行
try { Thread.sleep(24hours); } catch (Exception ex) { }
但問題是,當用戶關閉他的設備前24小時,當把它的線程將再次睡24小時。
因此,我正在考慮一種方法來管理這取決於系統的時鐘。當設備的時間爲晚上9點時,應用程序將會收到警報,我將完成這項工作。
是否可以做到這一點?
我想在我的應用程序中進行自動同步,每天晚上9點發生。我的方式這樣做:發出通知,每天下午9:00運行
try { Thread.sleep(24hours); } catch (Exception ex) { }
但問題是,當用戶關閉他的設備前24小時,當把它的線程將再次睡24小時。
因此,我正在考慮一種方法來管理這取決於系統的時鐘。當設備的時間爲晚上9點時,應用程序將會收到警報,我將完成這項工作。
是否可以做到這一點?
您想安排您的應用程序在特定時間運行。黑莓的操作系統支持這個。請參閱Schedule a BlackBerry application
你看過Quartz(http://www.quartz-scheduler.org/)嗎?也許它會適用。
這似乎對移動設備來說過分了。另外,是否有這個java-me版本? –
也許你可以用Calendar做到這一點:
boolean nine=false;
//until it's nine'o clock
while(!nine){
Calendar calendar=Calendar.getInstance();
if(calendar.get(Calendar.HOUR_OF_DAY)==9&&calendar.get(Calendar.MINUTE)==0&&calendar.get(Calendar.SECOND)==0&&calendar.get(Calendar.MILLISECOND)==0){
nine=true;
nine=true;
}
else {
sleep(yourTime);
}
}
//...whatever should happen now...
//put the boolean back to false;
nine=false;
是的,完成了。但是在你的代碼中,你會做出一段時間的真實條款,這是不正確的做法。 –
我犯了一個虛假的條款...但爲什麼這不是正確的方式? – Neifen
我不想做一段時間的真正條款。我正在考慮另一種不會使用Thread.sleep和while true子句的方式。我用你之前在那裏寫過的算法做了這個,但試圖讓事情變得更好 –
我建議使用已取得的提供,開源Java調度之一:List of Open Source Job Schedulers in Java
一個我很熟悉的就是在第一該列表:Quartz
...看起來像有人打我。 (上面的答案是在我寫這篇文章的時候添加的)
但是,爲了快速擴展,您可以輕鬆地設置在後臺運行的「作業」,與用戶分開。現在我已經親自使用這個網站,而不是用戶可以關閉和打開的設備。話雖如此,我確信你之前所做的努力已經被解決了,你應該嘗試一下石英,它可以做你需要的東西。
祝你好運, -Asaf
感謝您的評論。但你不覺得他後端的Quartz使用thread.sleep嗎?他肯定是......如果是的話,那麼這對我來說並不會幫助我。我不知道我會試試這個,看看會發生什麼 –
爲什麼不用一個if語句來詢問石英工作是否已經存在並且正在運行,如果是的話,不要重新開始工作? – Asaf
這似乎對移動設備來說過分了。另外,有沒有一個java-me版本的石英? –
這個問題可能通過運行簡單的後臺線程來解決。
public static void main(String[] args) {
Thread myJobThread = new Thread(this, "My background job");
myJobThread.setDaemon(true);
myJobThread.start();
}
// check the time every minute
private int checkRate = 60000;
@Override
public void run() {
while(true) {
Date now = new Date();
if (now > 9a.m.) {
// do your stuff
}
try {
Thread.sleep(checkRate);
} catch (InterruptedException e){
// handle ex
}
}
}
我不想使用後臺線程。我正在尋找更好的方法來做到這一點 –
did'nt你忘記你的線程中的循環?或者是'setDaemon(true);'對此負責? – Neifen
是的,你可以使用石英和類似的東西。問題是如果你需要它。事實上石英也使用後臺線程。如果你不希望你的應用程序變得很小,並且你不需要任何複雜的工作管理,那麼後臺線程就是我的想法。 –
您可以考慮使用RealTimeClockListener
。然後,您將編寫一個方法clockUpdated()
,該方法將每分鐘由操作系統調用。在那裏,你可以做你的計算,以確定是否是時候執行你的代碼。
您也許可以使用OS調度程序。什麼是操作系統? – mre
黑莓5.0,6.0和7.0。操作系統調度程序是什麼意思? –
例如[Windows任務計劃程序](http://en.wikipedia.org/wiki/Windows_Task_Scheduler) – mre