IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Timer VS SyncServiceManager + AlarmManager


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 172
    Points : 70
    Points
    70
    Par défaut Timer VS SyncServiceManager + AlarmManager
    Bonjour à tous,

    J'ai récemment codé un Service en background pour réaliser une tache à intervalles régulier qui doit :
    - rester actif quand l'appli est tuée (STICKY)
    - se relancer au reboot du device (BOOT_COMPLETED)
    - pouvoir être activé/désactivé par l'utilisateur via un Switch (sync on/off)

    Pour le moment j'ai donc ce service qui lance un Timer triggered toutes les 2 heures.

    Ma question est simple, cette implementation est elle acceptable ou serait il préférable de faire une implementation plus "lourde" avec un SyncServiceManager utilisant un AlarmManager etc... ?

    Et surtout, si cela s'avère préférable au simple Timer, pourquoi donc ?

    D'avance merci pour vos réponses

  2. #2
    Membre éclairé Avatar de alves1993
    Homme Profil pro
    Développeur Java/Dart/Javascript/Android (FullStack)
    Inscrit en
    Décembre 2012
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java/Dart/Javascript/Android (FullStack)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 222
    Points : 659
    Points
    659
    Un geek ne vieillit pas, il se met à jour.

    Pour plus d'informations sur Android regarder la faq Android.
    Ensuite les tutoriels Android sont disponibles ici
    Pour les mecs, qui n'arrivent pas toujours à digérer le Javascript, Dart peut-être une solution pour vous.

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Salut !

    Déjà le Timer ne fonctionne pas si le téléphone est en veille... et risque de ne plus fonctionner tant qu'il est verrouillé (selon les optimisation d'applications).
    Je n'aime pas trop l'approche "service background" qui fait un truc toutes les 2h pour ces raisons, mais aussi qu'il défie le principe de la programmation événementielle sur lequel est basé Android majoritairement.

    L'AlarmManager (+ BOOT_COMPLETED pour recréer les alarmes) permet d'avoir un bout de code appelé toutes les 2h, quelque soit l'état du téléphone, c'est déjà mieux.

    Le SyncManager permet en prime de s'affranchir des divers WakeLock à conserver (si le boulot à effectuer peut être long), mais aussi de l'état de connexion du téléphone (en mode avion, pas de sync effectué par exemple)...

    L'un dans l'autre, il faut voir l'action à effectuer toutes les 2h....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 172
    Points : 70
    Points
    70
    Par défaut
    Bonjour

    Alors oui je suis d'accord avec toi et suis actuellement en train de procéder au refactor de la chose tel que ::

    - AlarmManager ::
    ----> setInexactRepeating() afin de regrouper les alarmes de ce même type et ne pas reveiller le device plusieurs fois inutilement
    - OnBootCompletedReceiver ::
    ----> lance une synchro via un intentService en BG (worker thread)
    ----> relance l'alarm détruite lorsqu'on éteint le device
    - OnAlarmReceiver ::
    ----> lance une synchro via un intentService en BG (worker thread)

    par contre :
    Déjà le Timer ne fonctionne pas si le téléphone est en veille... et risque de ne plus fonctionner tant qu'il est verrouillé (selon les optimisation d'applications).
    - en veille, si : testé et ca fonctionne (peut être parce que mon service était STICKY?)
    - éteint non mais l'Alarm non plus puisqu'il nous faut la recréer au BOOT_COMPLETED

    Après j'aurais une dernière question sur ces alarmes :
    - celle que je créé actuellement fonctionne toutes les 2h
    - je teste sur le PendingIntent pour savoir si cette alarm est deja active car je ne souhaite pas la reset à chaque passage dans mon onCreate()
    ma question est donc :
    - le jour ou je fais une MAJ de l'application et que je change le temps à 3h, cela sera t'il pris en compte? ou faudra t'il attendre que l'utilisateur éteigne son device que l'Alarm A soit détruite et que je recréé une Alarm B au BOOT_COMPLETED ?

    Et enfin ,
    Le SyncManager permet en prime de s'affranchir des divers WakeLock à conserver (si le boulot à effectuer peut être long), mais aussi de l'état de connexion du téléphone (en mode avion, pas de sync effectué par exemple)...
    L'un dans l'autre, il faut voir l'action à effectuer toutes les 2h....
    Pour l'instant je ne retient pas de Wakelock, dans les divers article que jai parcouru je suis tombé sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WakefulIntentService.acquireStaticLock(context); //acquire a partial WakeLock
     context.startService(new Intent(context, TaskButlerService.class)); //start TaskButlerService
    L'action a effectuer est une serie d'appels WebServices afin de maintenir la BDD "à jour" sans devoir faire attendre l'utilisateur à l'ouverture de l'appli.

    Si j'ai bien suivi, le WakeLock permet d'empecher l'OS de tuer le service en cas de baisse de ressources c'est bien cela ?
    Du coup, dans mon cas, ce service se reveille toutes les 2 heures pour effectuer un travail de quelques secondes grand maximum...
    Je serai donc d'avis de dire que c'est superflu ?

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo