À partir de la documentation Firebase JobDispatcher Firebase JobDispatcher

setTrigger(Trigger.executionWindow(0, 60))
// start between 0 and 60 seconds

mais pourquoi mon service fonctionne deux fois

Code Firebase JobDispatcher

    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job job = dispatcher.newJobBuilder()
            .setTag("testing job")
            .setService(TestingJob.class)
            .setReplaceCurrent(true)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0,1))
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setLifetime(Lifetime.FOREVER)
            .build();

    dispatcher.mustSchedule(job);

Classe de test (Job Service)

public class TestingJob extends JobService {

    private static final String TAG = "TestingJob";
    private int i =0;
    @Override
    public boolean onStartJob(JobParameters job) {

        Log.d(TAG, "onStartJob Testing Job: "+new Date().toString());
        Log.d(TAG, "onStartJob: i = "+String.valueOf(i));
        i+=1;
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters job) {

        Log.d(TAG, "onStopJob Testing Job: Stopped");
        return false;
    }
}

Log Cat

11-28 00:08:57.666 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017
11-28 00:08:57.666 11793-11793: onStartJob: i = 0
11-28 00:08:57.791 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017
11-28 00:08:57.791 11793-11793: onStartJob: i = 0

Manifeste

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <service android:name=".services.TestingJob"
            android:exported="false">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
    </service>

Puis-je utiliser à nouveau mon Job Service signifie que int i doit augmenter à chaque fois.

Merci de votre aide

11
Salman500 27 nov. 2017 à 22:30

3 réponses

Meilleure réponse

Je pense qu'une méthode que nous devrions connaître

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job job = dispatcher.newJobBuilder()
            .setTag("testing job")
            .setService(TestingJob.class)
            .setReplaceCurrent(true)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0,1))
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setLifetime(Lifetime.FOREVER)
            .build();

    dispatcher.mustSchedule(job);

Dans ce que vous définissez
.setRecurring(true): cela signifie le répéter en continu. régler le déclencheur avec début et fin .setTrigger(Trigger.executionWindow(start, end)):

.setReplaceCurrent(false): cela signifie ne pas écraser une tâche existante avec la même balise.

4
Rob 4 avril 2018 à 03:34

Je pense que la raison pour laquelle il s'exécute 2 fois est votre fenêtre d'exécution.

.setTrigger(Trigger.executionWindow(0,1))

Il n'y a qu'une fenêtre de temps d'une seconde. Essayez avec un intervalle plus large, comme (0, 60), cela devrait faire l'affaire.

Pour répondre à votre autre question sur votre variable i, vous devez la rendre statique:

private static int i = 0;
2
VollNoob 29 nov. 2017 à 14:27

Votre int i ne s'incrémentera pas à chaque fois.

setTrigger(Trigger.executionWindow(0, 60))

Et ce JobTrigger déterminera que le Job créé est maintenant prêt à être exécuté. Vous avez spécifié une fenêtre d'exécution de 0 à 1 seconde. C'est pourquoi votre travail se déclenche à chaque seconde.

Ce déclenchement est important car les tâches récurrentes nécessitent toujours un déclencheur de fenêtre d'exécution. Bien sûr, si votre travail n'est pas récurrent, vous n'avez pas besoin de définir de déclencheur pour cela.

Votre premier paramètre est l'intervalle de temps en secondes entre 2 jobs et le second paramètre est l'intervalle de temps + le temps flexible synchronisé en secondes.

1
Shamsul Arafin Mahtab 24 févr. 2018 à 19:47
47518439