2012-01-02 5 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

이 질문을 두 번 제출했습니다. 나는 3를 볼 수있다! 동일한 주제를 다루는 질문. 일반적으로 질문은 결코 죽지 않습니다.이 주제와 관련된 첫 번째 질문을 해결하고 남은 두 가지를 제거하십시오. 힌트 : 질문에 제공된 코드의 양을 줄이고 관련 부분을 제공하십시오. – home

+0

[Service ScheduleTask 가능한 일정한 간격으로 시작할 수 없습니다] 복제본 (http://stackoverflow.com/questions/8662034/service-scheduletask-itnt-started-in-constant-intervals) – home

답변

1

AlarmManager를 사용하십시오. 당신은 안드로이드가 그런 식으로 작동 할 것이라고 확신하지 못하는 쓰레드를 잠자기 상태로 만들고 있습니다. 이 같은 것이 당신을 도울 것입니다. 이 서비스를 매 시간마다 시작됩니다 :

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가 프로세스 및 응용 프로그램을 처리하는 방법에 대해서는 here을 읽어야합니다.

+0

아니요. 절대 아닙니다. . 나는 그것에 대해 생각하여 서비스가 얼마나 오랫동안 실행되었는지 추적하고 중단없이 몇 시간 동안 실행했는지 ... –

관련 문제