2014-12-31 18 views
8

Sto cercando di implementare il servizio di aggiornamento in background con il nuovo JobScheduler (compatibile con tatarka). Ecco il mio servizioAndroid JobScheduler funziona sempre per 1 minuto

@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; 
} 

Ecco il mio JobInfo

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

Nel registro vedo che il mio lavoro funziona sempre per 1 minuto 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

Allora perché? Sono impostato periodicamente su 2000 ms, qualsiasi valore non influenza l'intervallo di 1 minuto per il lavoro. Perché?

+2

Hai mai capito perché era? – Papajohn000

+0

@ Papajohn000 No, non l'ho fatto. – onCreate

+1

Non so se è ancora pertinente, ma potrebbe esserci un limite minimo per il tempo nel pianificatore di lavoro. So che Alarm Manager ha un limite minimo di 2 minuti. – Papajohn000

risposta

3

Sembra che tu stia chiedendo perché è possibile accedere a Starttop esattamente un minuto dopo l'avvio del lavoro. Questo timeout di 1 minuto è definito nel codice here

0

43matthew è corretto, ma mi piacerebbe aggiungere qualcosa di più a questo. I 2000 ms di cui si sta parlando sono gli intervalli periodici dopo i quali il lavoro ricomincia, ovvero eseguire questo lavoro ogni 2000 ms, non l'intervallo per il quale verrà eseguito il lavoro.

+0

Non penso che sia corretto; Solo Android garantisce che verrà eseguito "al massimo una volta" durante ciascun intervallo di 2000 ms. Ciò significa (a) che è un intervallo e (b) non può eseguire il tuo lavoro durante tutto questo. – Tom

6

Fino a Android 5.1.1 c'era un timeout di 60 secondi per un singolo lavoro. A partire da Android 6, il timeout è ora di 10 minuti.

6

onStopJob viene chiamato quando il sistema desidera annullare il lavoro. Il motivo per cui sta annullando il tuo lavoro è perché pensa che sia ancora in esecuzione. È necessario chiamare jobFinished(params, bool) ad un certo punto del proprio lavoro per comunicare al programmatore che è completo, altrimenti scadrà il tempo e chiamare lo onStopJob per annullarlo. Inoltre, la restituzione di "true" da onStartJob indica al sistema che l'elaborazione non è stata completata. Dovresti restituire 'falso' a meno che tu non stia ancora facendo un lavoro extra, ad es. passare il lavoro a un thread separato.

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

Da API 26 (Oreo), l'impostazione di un periodo inferiore a 15 minuti per i processi periodici eseguirà almeno dopo 15 minuti.

Problemi correlati