2012-01-02 9 views
1

サービスがあり、前と現在のhtmlコードを比較する必要があります。サービススケジュールタスクが一定の間隔で開始されていません

私はそれを1時間ごとに行うように設定しましたが、実際にはそれは奇妙な非線形の間隔で行います。私は、作業が完了するたびにログファイルを書き込むコマンドをコードに追加しました。結果は奇妙です:間隔が1時間未満、場合によってはそれ以上(2-3時間)、時には実際に1時間... 編集:間隔が短い(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

この質問を2回送信しました。私は3を見ることができます!同じトピックをカバーする質問。一般的に質問は決して「死んでいる」ことはありません。このトピックに関する最初の質問に取り組み、残りの2つを削除してください。ヒント:質問に記載されたコードの量を減らそうとします。 – home

+0

可能な複製[Service ScheduleTaskは一定の間隔で開始していません](http://stackoverflow.com/questions/8662034/service-scheduletask-itnt-started-in-constant-intervals) – home

答えて

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

これは私のコードにどのように適用するのか分かりませんでした。あなたは何を置き換えるべきか教えてくれますか? –

+0

@Ron私の編集を参照してください! – sfratini

+0

よろしくお願いします。数時間それをチェックし、それが働くかどうか教えてください –

0

あなたはAndroidタスクマネージャによってアクティビティが破棄され、タイマーによってシャットダウンされないことがあります。これが、より短い値を得ている理由です。そして、これが、非常に低い価値を設定するとき、あなたがそれを得ない理由です。

Androidがプロセスとアプリケーションをどのように処理するかについては、hereをお読みください。

+0

いいえ、これは絶対にありません。私はそれについて考えていたので、サービスの実行時間と途中で何時間も実行されていることを追跡しました... –

関連する問題