À 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
3 réponses
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.
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;
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.
De nouvelles questions
android
Android est le système d'exploitation mobile de Google, utilisé pour la programmation ou le développement d'appareils numériques (Smartphones, tablettes, automobiles, téléviseurs, Wear, Glass, IoT). Pour les sujets liés à Android, utilisez des balises spécifiques à Android telles que l'intention d'Android, l'activité d'Android, l'adaptateur Android, etc. Pour les questions autres que le développement ou la programmation, mais liées au cadre Android, utilisez ce lien: https: // android.stackexchange.com.