2011-09-13 38 views
1

我想在我的應用程序中進行自動同步,每天晚上9點發生。我的方式這樣做:發出通知,每天下午9:00運行

try { Thread.sleep(24hours); } catch (Exception ex) { } 

但問題是,當用戶關閉他的設備前24小時,當把它的線程將再次睡24小時。

因此,我正在考慮一種方法來管理這取決於系統的時鐘。當設備的時間爲晚上9點時,應用程序將會收到警報,我將完成這項工作。

是否可以做到這一點?

+1

您也許可以使用OS調度程序。什麼是操作系統? – mre

+0

黑莓5.0,6.0和7.0。操作系統調度程序是什麼意思? –

+0

例如[Windows任務計劃程序](http://en.wikipedia.org/wiki/Windows_Task_Scheduler) – mre

回答

2

你看過Quartz(http://www.quartz-scheduler.org/)嗎?也許它會適用。

+0

這似乎對移動設備來說過分了。另外,是否有這個java-me版本? –

-1

也許你可以用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; 
+0

是的,完成了。但是在你的代碼中,你會做出一段時間的真實條款,這是不正確的做法。 –

+0

我犯了一個虛假的條款...但爲什麼這不是正確的方式? – Neifen

+0

我不想做一段時間的真正條款。我正在考慮另一種不會使用Thread.sleep和while true子句的方式。我用你之前在那裏寫過的算法做了這個,但試圖讓事情變得更好 –

2

我建議使用已取得的提供,開源Java調度之一:List of Open Source Job Schedulers in Java

一個我很熟悉的就是在第一該列表:Quartz

...看起來像有人打我。 (上面的答案是在我寫這篇文章的時候添加的)

但是,爲了快速擴展,您可以輕鬆地設置在後臺運行的「作業」,與用戶分開。現在我已經親自使用這個網站,而不是用戶可以關閉和打開的設備。話雖如此,我確信你之前所做的努力已經被解決了,你應該嘗試一下石英,它可以做你需要的東西。

祝你好運, -Asaf

+0

感謝您的評論。但你不覺得他後端的Quartz使用thread.sleep嗎?他肯定是......如果是的話,那麼這對我來說並不會幫助我。我不知道我會試試這個,看看會發生什麼 –

+0

爲什麼不用一個if語句來詢問石英工作是否已經存在並且正在運行,如果是的話,不要重新開始工作? – Asaf

+0

這似乎對移動設備來說過分了。另外,有沒有一個java-me版本的石英? –

0

這個問題可能通過運行簡單的後臺線程來解決。

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 
       } 
      } 
     } 
+1

我不想使用後臺線程。我正在尋找更好的方法來做到這一點 –

+0

did'nt你忘記你的線程中的循環?或者是'setDaemon(true);'對此負責? – Neifen

+0

是的,你可以使用石英和類似的東西。問題是如果你需要它。事實上石英也使用後臺線程。如果你不希望你的應用程序變得很小,並且你不需要任何複雜的工作管理,那麼後臺線程就是我的想法。 –

0

您可以考慮使用RealTimeClockListener。然後,您將編寫一個方法clockUpdated(),該方法將每分鐘由操作系統調用。在那裏,你可以做你的計算,以確定是否是時候執行你的代碼。

相關問題