2014-12-31 4 views
8

Ich versuche, Hintergrund-Refreshing-Service mit neuen JobScheduler zu implementieren (compat by tatarka). Hier ist mein DienstAndroid JobScheduler funktioniert immer für 1 Minute

@Override 
public boolean onStartJob(JobParameters params) { 
    Timber.i("on start job: " + params.getJobId()); 
    return true; 
} 

@Override 
public boolean onStopJob(JobParameters params) { 
    Timber.i("on stop job: " + params.getJobId()); 
    return true; 
} 

Hier ist meine Jobinfo

public void scheduleJob(View v) { 
    JobInfo job = new JobInfo.Builder(kJobId++ /*jobid*/, new ComponentName(getActivity(), RefreshJobService.class)) 
      .setPeriodic(2000) 
      .build(); 
    mTestService.scheduleJob(job); 
} 

In log ich sehe, dass meine Arbeit immer für 1 Minute arbeitet 12-31 12:38:03.884 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:39:03.891 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:40:03.911 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:42:08.841 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:43:08.858 10059-10059/@/RefreshJobService﹕ on stop job: 0

Warum? Ich bin regelmäßig auf 2000ms eingestellt, jeder Wert hat keinen Einfluss auf 1 Minute Intervall für den Job. Warum?

+2

Haben Sie jemals herausgefunden, warum das so war? – Papajohn000

+0

@ Papajohn000 Nein, habe ich nicht. – onCreate

+1

Ich weiß nicht, ob es immer noch relevant ist, aber es könnte eine minimale Zeitgrenze für den Job-Scheduler geben. Ich weiß, dass der Alarm Manager eine Mindestgrenze von 2 Minuten hat. – Papajohn000

Antwort

3

Es klingt, als würden Sie fragen, warum Sie onStopJob genau eine Minute nach dem Start Ihres Jobs erhalten. Diese 1 Minute Timeout ist in Code definiert here

0

43matthew ist richtig, aber ich möchte etwas mehr dazu hinzufügen. Die 2000 ms, über die Sie sprechen, ist das periodische Intervall, nach dem der Job erneut gestartet wird, d. H. diesen Job alle 2000 ms ausführen, nicht das Intervall, für das der Job ausgeführt wird.

+0

Ich glaube nicht, dass das korrekt ist; Android garantiert nur, dass es in jedem 2000ms-Intervall "höchstens einmal" läuft. Dies bedeutet (a) es ist ein Intervall und (b) es kann Ihre Arbeit währenddessen überhaupt nicht ausführen. – Tom

6

Bis Android 5.1.1 gab es eine Zeitüberschreitung von 60 Sekunden für einen einzelnen Job. Ab Android 6 beträgt das Timeout jetzt 10 Minuten.

6

onStopJob wird aufgerufen, wenn das System den Auftrag abbrechen möchte. Der Grund dafür, dass du deinen Job annullierst, ist, dass er denkt, dass er noch läuft. Sie müssen jobFinished(params, bool) an irgendeinem Punkt in Ihrem Job anrufen, um dem Scheduler mitzuteilen, dass es abgeschlossen ist, andernfalls wird es eine Zeitüberschreitung geben und onStopJob aufrufen, um es abzubrechen. Darüber hinaus teilt das Zurückgeben von "True" von onStartJob dem System mit, dass die Verarbeitung noch nicht abgeschlossen ist. Sie sollten 'false' zurückgeben, wenn Sie noch zusätzliche Arbeit leisten, z. die Arbeit an einen separaten Thread übergeben.

@Override 
public boolean onStartJob(JobParameters params) { 
    Timber.i("on start job: " + params.getJobId()); 
    jobFinished(params, false); 
    return false; 
} 
2

Von API 26 (Oreo), einen kleineren Zeitraum als 15 Minuten für die periodischen Jobs Einstellung wird mindestens nach 15 Minuten auszuführen.