70 votes

Firebase JobDispatcher - comment fonctionne-t-il par rapport aux API précédentes (JobScheduler et GcmTaskService) ?

Contexte

Google dispose de plusieurs solutions pour la planification des tâches, telles que JobScheduler et GcmTaskService . Chacun a ses propres avantages et inconvénients.

Récemment, Google a présenté une nouvelle bibliothèque appelée "Firebase JobDispatcher".

Le problème

Malheureusement, il y a très peu de choses à lire sur cette nouvelle API. En fait, il est vraiment difficile de trouver quoi que ce soit à son sujet.

La seule chose que j'ai trouvée est leur vidéo d'annonce et un échantillon . Mais même eux, il n'y a pas grand-chose à savoir sur cette API.

Les questions

En regardant les questions précédentes, les enquêtes et les comparaisons que j'ai faites avec les autres API ( ici par exemple), j'aimerais demander comment fonctionne la nouvelle API et savoir ce qu'il faut prendre en compte lors de son utilisation :

  1. Un travail peut-il avoir des paramètres qui restent avec lui et peuvent même être modifiés si nécessaire ? Il est dit dans l'exemple " Un ensemble optionnel d'extras fournis par l'utilisateur. La valeur par défaut est un ensemble vide. " Est-ce que c'est ça ? Peut-il être modifié par le job lors de son exécution ?

  2. Les emplois peuvent-ils être facilement reprogrammés ? On dit que " Un booléen indiquant si le job doit être répété. " . Comment choisir le moment de la reprogrammation ? J'ai essayé l'exemple, et j'ai choisi "récurrent", mais il ne semble pas s'exécuter à nouveau, seulement une fois.

  3. Peut-il être protégé contre les emplois de la bibliothèque (en raison des identifiants uniques) ?

  4. La mise à jour de l'application nécessite-t-elle une attention particulière (comme c'était le cas pour les API précédentes) ? Les tâches peuvent-elles encore être programmées après une mise à jour de l'application ? En testant l'échantillon, il semble que les tâches aient complètement disparu après une mise à jour de l'application. Peut-on l'éviter ?

  5. Faut-il RECEIVE_BOOT_COMPLETED au cas où je voudrais que la tâche soit toujours planifiée même si l'appareil est redémarré ? L'exemple semble l'avoir fait.

  6. Est-il possible d'obtenir une liste de tous les travaux programmés et leurs informations (y compris les paramètres), et de pouvoir les annuler ou les modifier ?

  7. Une tâche sera-t-elle supprimée lorsque l'application effacera les données ?

  8. Est-il possible de dire à la tâche qu'il est préférable qu'elle soit exécutée dans une plage horaire (exemple : entre 7h00 et 8h00 du matin) ? Il est mentionné " ExecutionWindowTrigger - qui spécifie une fenêtre de temps dans laquelle le job doit être exécuté. ". C'est ça ? Que se passe-t-il quand il manque cette fenêtre ?

  9. La méthode onStartJob sur JobService renvoie un booléen et la description de cette classe est " s'il y a encore du travail à faire. " Qu'est-ce que cela signifie ? Qu'est-ce que le needsReschedule paramètre de jobFinished que signifie cette méthode ? Sont-elles liées les unes aux autres ?

  10. Y a-t-il des restrictions que je devrais connaître ? Par exemple, des valeurs minimales et maximales pour chacune des fonctions ?

1 votes

Bonjour, j'utilise cette librairie depuis quelques jours, pour le #2 elle est récurrente pour moi, mais elle ne semble pas honorer les nombres spécifiés dans la fenêtre d'exécution.

1 votes

@eriuzo Comment cela se reproduit-il pour vous ? toutes les secondes/minutes ? Comment avez-vous fait pour que ça marche ?

1 votes

Je n'ai pas enregistré les chiffres la première fois, laissez-moi les enregistrer, je posterai peut-être une réponse demain.

102voto

Flavio Points 1716

En fait, Firebase Android JobDispatcher est une couche d'abstraction autour des moteurs de planification des tâches sur Android. Et pour l'instant, ils n'ont qu'une seule implémentation de pilote pour GCM Network Manager. Cela signifie qu'actuellement il se comporte de la même manière que Le gestionnaire de réseau GCM se comporte . Nous espérons que d'autres conducteurs seront mis en place à l'avenir.

1. Un travail peut-il avoir des paramètres qui restent avec lui et peuvent même être modifiés si nécessaire ? Dans l'exemple, il est dit : "Un ensemble optionnel d'extras fournis par l'utilisateur. La valeur par défaut est un Bundle vide". . Est-ce bien cela ? Peut-il être modifié par le travail lors de son exécution ?

  1. Oui, Job.Builder a méthode setExtras avec un paquet arbitraire auquel on peut accéder plus tard par le biais de jobParameters.getExtras() . Vous ne pouvez pas modifier la liasse ( jobParameters ne contient que des getters). Vous pouvez replanifier votre travail avec le drapeau setReplaceCurrent(true) et spécifier une nouvelle liasse.

2. Les tâches peuvent-elles être facilement reprogrammées ? Il est dit "Un booléen indiquant si le job doit être répété". Comment peut-on choisir le moment de la reprogrammation ? J'ai essayé l'exemple, et choisi "Récurrent", mais il ne semble pas s'exécuter à nouveau, seulement une fois.

  1. Pour replanifier un travail, vous devez spécifier setRecurring(true) , setTrigger(Trigger.executionWindow(10, 20))

Cela se déclenche dès que la date limite de démarrage de la fenêtre est atteinte. Les conducteurs sont encouragés à exécuter le job avant la fin de la fenêtre, si possible. fenêtre si possible.

3. Peut-il être protégé contre les emplois de la bibliothèque (à cause des identifiants uniques) ?

  1. Les étiquettes de poste doivent être uniques dans votre application. Les autres applications du téléphone ont leurs propres "points de terminaison" (nom du paquet/nom du service). Pour voir toutes les tâches programmées/terminées pour GooglePlayDriver veuillez utiliser

    adb shell dumpsys activity service GcmService

4. La mise à jour de l'application nécessite-t-elle une attention particulière (comme c'était le cas pour les API précédentes) ? Les tâches peuvent-elles encore être programmées après une mise à jour de l'application ? En testant l'échantillon, il semble que les tâches aient complètement disparu après une mise à jour de l'application. Peut-on l'éviter ?

  1. Quant au gestionnaire du réseau GCM GooglePlayDriver ne reprogramme pas les emplois après la mise à jour des services Google Play ou de l'application. Voici une problème ouvert pour cela. Donc pour l'instant, c'est votre responsabilité.

5. A-t-il besoin de RECEIVE_BOOT_COMPLETED au cas où je voudrais que la tâche soit toujours planifiée même lorsque le dispositif est redémarré ? L'exemple semble l'avoir.

  1. Oui, vous avez besoin de cette permission. Builder a un paramètre pour contrôler le comportement : setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT) Bien sûr, si vous voulez créer votre propre pilote, vous devrez vous occuper vous-même de la durée de vie.

6. Est-il possible d'obtenir une liste de tous les travaux programmés et leurs informations (y compris les paramètres), et de pouvoir les annuler ou les modifier ?

  1. Non, c'est la même chose que pour le gestionnaire de réseau GCM. Mais vous pourriez suivre vous-même tous les travaux d'une manière ou d'une autre tout en les programmant pour les services de lecture.

7. Un travail sera-t-il supprimé lors de l'opération d'effacement des données de l'application ?

  1. Oui, la tâche sera supprimée. Probablement que dans les versions précédentes de google play services il se comportait différemment.

8. Est-il possible de dire au job qu'il est préférable qu'il s'exécute dans une plage horaire (exemple : entre 7:00 et 8:00 du matin) ? Il est mentionné "ExecutionWindowTrigger- qui spécifie une fenêtre de temps dans laquelle le job doit être exécuté" . Est-ce bien cela ? Que se passe-t-il lorsque cette fenêtre est manquée ?

  1. Vous pourriez programmer une alarme pour qu'elle soit déclenchée à 7 heures et programmer un travail non récurrent avec executionWindow(0, 60*60) . Le travail se déroulera entre 7h00 et 8h00.
    Vous ne pouvez pas utiliser les travaux récurrents car

    windowStart - L'heure la plus proche (en secondes) à laquelle la tâche doit être considéré comme admissible à l'exécution. Calculé à partir du moment où le travail a été planifié (pour les nouveaux travaux) ou la dernière exécution (pour les travaux récurrents).

De plus, l'ExecutionWindowTrigger spécifie un temps approximatif. Il n'est pas garanti que le travail s'exécutera dans la fenêtre indiquée. S'il manque la fenêtre, le travail sera exécuté plus tard.

9. La méthode "onStartJob" de la classe "JobService" renvoie un booléen et sa description est "s'il reste du travail". . Qu'est-ce que cela signifie ? Que signifie le paramètre "needsReschedule" de la méthode "jobFinished" ? Sont-ils liés l'un à l'autre ?

  1. si onStartJob retourne false, ce qui signifie que vous avez terminé votre travail. Pas besoin d'invoquer jobFinished . Le site RESULT_SUCCESS est envoyé automatiquement.

si onStartJob retourne vrai, cela signifie que vous avez lancé un fil de discussion et que vous attendez les résultats. Dès que vous avez terminé, vous devez invoquer jobFinished pour informer les services de google play si le travail doit être reprogrammé ou non. Si oui, la tâche sera reprogrammée en fonction des critères suivants RetryStrategy .

10. Y a-t-il des restrictions que je devrais connaître ? Par exemple, des valeurs minimales et maximales pour chacune des fonctions ?

    • onStartJob doit décharger le travail sur un autre fil d'exécution dès que possible. Ils fournissent un SimpleJobService comme un exemple de ce que l'on attend de vous.
    • Il n'y a pas d'implémentation de pilote pour l'algorithme Lollipop JobScheduler . Il faut également gérer la situation lorsque les services de Google Play ne sont pas disponibles, nous devrions probablement mettre en œuvre la solution suivante Driver sur la base de AlarmManager .

0 votes

Je vous remercie pour cela. Malheureusement, j'ai abandonné cette question il y a longtemps. Je vais vous donner une note positive pour l'effort, mais comme je ne peux pas savoir à quel point elle est bonne, je ne la marquerai pas comme acceptée. Peut-être qu'un jour j'y reviendrai et la marquerai.

1 votes

Il serait tellement utile de voir la question citée avant la réponse. Il faut maintenant faire défiler les questions de haut en bas.

0 votes

"Y a-t-il des restrictions que je devrais connaître ?" Il est important de noter - pour la plupart des choses de Firebase - que le client Android est closed source et inclut des dépendances étranges sur le GPS. Cela permet à Google de contrôler son utilisation et empêche votre application de fonctionner sur Amazon Android ou sur la plupart des appareils Android en Chine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X