2012-01-02 52 views
1

我有一個需要比較以前和當前html代碼的服務。Service ScheduleTask不是以固定間隔啓動的

我已經配置它每1小時完成一次工作,但它實際上是在奇怪的非線性間隔中完成的。我在代碼中添加了一條命令來編寫日誌文件,以便在工作完成時查看。結果很奇怪:有時間隔小於一小時,有時甚至更多(2-3小時),有時甚至是一小時... 編輯:間隔時間較短(1分鐘)時,它正常工作這裏是我的代碼:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
    executorService.scheduleWithFixedDelay(new Runnable() { 

     public void run() { 
      try { 
       if (isNetworkAvailable()) { 
        doServiceWork(); 
        check("SLeEPING!!!", c); 
       } 
       else { 
        check ("NO INTERNET", c); 
       } 
      } 
      catch (Exception e) {check("78", c);} 
     } 
    }, 1, 3600, TimeUnit.SECONDS); 

} 
+0

您已提交此問題兩次。我可以看到3!涵蓋同一主題的問題。總的來說,一個問題永遠不會「死亡」,請處理與此主題相關的第一個問題,並刪除剩下的兩個問題......提示:儘量減少問題中提供的代碼量,只提供相關部分。 – home 2012-01-02 15:20:25

+0

可能重複的[Service ScheduleTask不是以固定間隔開始](http://stackoverflow.com/questions/8662034/service-scheduletask-itnt-started-in-constant-intervals) – home 2012-01-02 15:21:52

回答

1

使用AlarmManager。你正在使線程睡眠,我不確定Android會保證它會以這種方式工作。像這樣的東西應該可以幫到你。這將啓動該服務每隔一小時:

PendingIntent serviceIntent= PendingIntent.getService(context, 
        0, new Intent(context, MyService.class), 0); 

      long firstTime = SystemClock.elapsedRealtime(); 
      AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

      long currenciesIntervalInSec = 3600; 

      if (automaticCurrencies) 
       am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, currenciesIntervalInSec*1000, serviceIntent); 

編輯:

您應該擴展IntentService。它處理線程,一切都在後臺完成(如果需要在後臺執行任務並且不需要同時有多個線程,它尤其有用)。無論您在HandleIntent中放置什麼,都將在您啓動服務時執行。在內部它將保持隊列的列表。

例如,這是一個簡單的服務類(您需要創建兩個構造):

public class MyService extends IntentService { 

    public MyService() { 
     super("MyService"); 
    } 

    public MyService(String name) { 
     super(name);   
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 

       if (isNetworkAvailable()) { 
        doServiceWork(); 
        check("SLeEPING!!!", c); 
       } 
       else { 
        check ("NO INTERNET", c); 
       } 

     } 
} 

另外,你需要在你的清單(當然,用自己的包)補充一點:

<service android:name="com.services.MyService"/> 
+0

嗯,我不明白我是如何將它應用於我的代碼的。你能告訴我要替換什麼嗎? – 2012-01-02 20:05:17

+0

@Ron看我的編輯! – sfratini 2012-01-02 20:14:48

+0

好的!生病檢查了幾個小時,我會告訴你它是否有效 – 2012-01-02 20:18:45

0

也許你的活動被Android任務管理器銷燬並且它沒有被定時器關閉。這就是爲什麼你得到更短的價值。這就是爲什麼,當設置一個非常低的值時,你不明白。

您應該瞭解Android如何處理進程和應用程序here

+0

不,這絕對不是這個。我想了想,所以我追蹤了服務運行了多長時間,並且運行了幾個小時而沒有中斷... – 2012-01-02 19:49:31

相關問題