2015-08-18 69 views
15

Il JobScheduler chiama onStartJob() più volte, anche se il lavoro è terminato. Tutto funziona bene, se pianifico un singolo lavoro e aspetto che sia terminato. Tuttavia, se pianifico due o più lavori con ID diversi allo stesso tempo, viene richiamato onStartJob() dopo aver richiamato jobFinished().Android JobScheduler onStartJob chiamato più volte

Per esempio ho pianificazione di un processo 1 e di lavoro 2 con esattamente gli stessi parametri eccetto l'ID, l'ordine è:

  1. onStartJob() per lavoro 1 e lavoro 2
  2. Entrambi i lavori di finitura, così jobFinished() è invocato per entrambi
  3. Dopo che onStartJob() viene chiamato di nuovo per entrambi i posti di lavoro con lo stesso ID

il mio lavoro è molto semplice e non complicata .

public class MyJobService extends JobService { 

    @Override 
    public boolean onStartJob(final JobParameters params) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        // do something 

       } finally { 
        // do not reschedule 
        jobFinished(params, false); 
       } 
      } 
     }).start(); 

     // yes, job running in the background 
     return true; 
    } 

    @Override 
    public boolean onStopJob(JobParameters params) { 
     // mark my background task as stopped 

     // do not reschedule 
     return false; 
    } 
} 

ho pianificare i posti di lavoro come questo

JobInfo jobInfo = createBaseBuilder(request) 
     .setMinimumLatency(2_000L) 
     .setOverrideDeadline(4_000L) 
     .setRequiresCharging(false) 
     .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) 
     .build(); 

int scheduleResult = mJobScheduler.schedule(jobInfo); 
// is always success 

Non so cosa c'è di sbagliato.

+0

Ho lo stesso problema, @vRallev. L'unico modo per evitare che il lavoro venga eseguito due volte è di restituire 'false' da' onStartJob() '(anche se ho impostato un' AsyncTask' in esecuzione in quel momento). Mentre questo sembra funzionare per me, sospetto che in futuro causerà problemi, in cui il sistema pensa che il lavoro sia finito e uccide il processo prematuramente. Hai mai trovato una soluzione a questo? – drmrbrewer

+0

Ricordo se un lavoro era già iniziato. Funziona per me, vedi https://github.com/evernote/android-job/blob/master/library/src/main/java/com/evernote/android/job/v21/PlatformJobService.java E: https : //github.com/evernote/android-job/blob/master/library/src/main/java/com/evernote/android/job/JobProxy.java#L110 – vRallev

risposta

4

Suppongo che sia causato dal processo in sospeso, quindi chiamo mJobScheduler.cancelAll() dopo l'avvio del servizio, problema risolto.

+1

Non capisco. Si pianifica il lavoro (JobService), quindi si chiama cancellAll()? Non dovrebbe essere il JobService a fermarsi quando è fatto (e non avere il sistema di riavviarlo, come per l'OP)? – drmrbrewer

3

Penso che questo si riferisca al bug di Android riportato here, che è stato apparentemente risolto per Android N ma sarà presente nelle versioni precedenti.

L'OP utilizza uno setOverrideDeadline(). La mia comprensione del problema riportato nel post collegato sopra è che se il lavoro è in esecuzione quando scade la scadenza di override, il processo verrà pianificato per essere eseguito nuovamente.

Quindi il consiglio è di assicurarsi che l'override si accenda prima che il lavoro sia pianificato (non sono sicuro di come è stato raggiunto) o dopo che è finito. Nessuno dei due sembra particolarmente soddisfacente, ma almeno sembra essere stato risolto in Android N.

1

questo è il problema in Android lollypop e Marshmallow. È stato risolto in Nougat come spiegato da Matthew Williams here

Problemi correlati