128 votes

Planification de tâches récurrentes dans Android

Je suis la conception d'une application qui a une tâche récurrente de l'envoi de la présence d'un serveur dédié, tant que l'application est en arrière plan.

dans mes recherches sur le web j'ai vu quelques approches différentes et je voulais savoir quelle est la meilleure façon de le faire.

Quelle est la meilleure manière de programmer un appel de serveur?

les options que j'ai vu étaient:

  1. Minuterie .

  2. ScheduledThreadPoolExecutor.

  3. Service.

  4. BroadcastReciever avec AlarmManager.

quel est votre avis?

EDIT:
la raison j'ai besoin c'est pour un chat application basée envoie toutes les actions de l'utilisateur à un serveur distant.
c'est à dire l'utilisateur est en train de taper un message, l'utilisateur est la lecture d'un message, l'utilisateur est en ligne, l'utilisateur est hors-ligne etc.

cela signifie qu'une fois tous les intervalle, j'ai besoin d'envoyer au serveur ce que je fais, ince, j'ai ouvert un chat avec d'autres personnes, ils ont besoin de savoir ce que je fais.

similaire à whatsapp message mécanisme de rétroaction: message looks delivered

168voto

Maid786 Points 578

Je ne suis pas sûr, mais selon mes connaissances, je partage mon point de vue. J'ai toujours accepter meilleure réponse si je me trompe .

Alarm Manager

L'Alarme Manager est titulaire d'un PROCESSEUR wake lock tant que l'alarme du récepteur onReceive() méthode est en cours d'exécution. Cela garantit que le téléphone ne sera pas dormir jusqu'à ce que vous avez fini de traiter la diffusion. Une fois onReceive() rendements, l'Alarme Gestionnaire de versions, ce réveil de verrouillage. Cela signifie que le téléphone, dans certains cas, le sommeil dès que votre onReceive() méthode est terminée. Si votre récepteur d'alarme appelés Context.startService(), il est possible que le téléphone de sommeil avant le service demandé est lancé. Pour éviter cela, votre BroadcastReceiver et Service devrez mettre en place un distinct sillage de verrouillage de la politique pour s'assurer que le téléphone continue de fonctionner jusqu'à ce que le service devient disponible.

Remarque: L'Alarme Manager est prévu pour les cas où vous voulez avoir votre demande de code à exécuter à un moment précis, même si votre application n'est pas en cours d'exécution. Pour le calendrier normal de l'exploitation (les tiques, les délais, etc...) il est plus facile et beaucoup plus efficace d'utiliser le Gestionnaire.

Minuterie

timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        synchronized public void run() {

            \\ here your todo;
            }

        }}, 60000, 60000);

Timer a quelques inconvénients qui sont résolus par la ScheduledThreadPoolExecutor. Il n'est donc pas le meilleur choix

ScheduledThreadPoolExecutor.

Vous pouvez utiliser java.util.Timer ou ScheduledThreadPoolExecutor (de préférence) pour planifier une action à intervalles réguliers sur un thread d'arrière-plan.

Voici un exemple de l'utilisation de ces derniers:

ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate
      (new Runnable() {
         public void run() {
            // call service
         }
      }, 0, 10, TimeUnit.MINUTES);

J'ai donc préféré ScheduledExecutorService

Mais Aussi de penser que, si les mises à jour se feront pendant que votre application est en cours d'exécution, vous pouvez utiliser un Timer, comme il est suggéré dans d'autres réponses, ou les plus récentes ScheduledThreadPoolExecutor. Si votre application sera mise à jour, même quand il n'est pas en cours d'exécution, vous devriez aller avec l' AlarmManager.

L'Alarme Manager est prévu pour les cas où vous voulez avoir votre demande de code à exécuter à un moment précis, même si votre application n'est pas en cours d'exécution.

Prendre note que si vous envisagez sur la mise à jour lorsque votre application est désactivée, une fois tous les dix minutes est assez fréquent, et donc peut-être un peu trop gourmands en énergie.

30voto

Deepak Bala Points 5706

Minuterie

Comme indiqué sur la documentation javadoc , vous êtes mieux à l'aide d'un ScheduledThreadPoolExecutor.

ScheduledThreadPoolExecutor

L'utilisation de cette classe lors de votre cas d'utilisation, nécessite plusieurs threads de travail et le sommeil de l'intervalle est petit. Combien de petits ? Eh bien, je dirais environ 15 minutes. L' AlarmManager commence à intervalles de planification à cette époque et il semble suggérer que, pour de plus petits intervalles de sommeil cette classe peut être utilisée. Je n'ai pas de données à l'arrière de la dernière déclaration. C'est une intuition.

Service

Votre service peut être fermé à tout moment par la VM. Ne pas utiliser les services pour les tâches récurrentes. Une tâche récurrente pouvez démarrer un service, ce qui est une tout autre affaire.

BroadcastReciever avec AlarmManager

Pour de plus longs intervalles de sommeil (>15 minutes), c'est le chemin à parcourir. AlarmManager a déjà constantes ( AlarmManager.INTERVAL_DAY ) ce qui suggère qu'il peut déclencher des tâches plusieurs jours après qu'il a été initialement prévu. Il peut aussi réveiller le PROCESSEUR pour exécuter votre code.

Vous devez utiliser l'une de ces solutions en fonction de votre timing et le thread de travail besoins.

0voto

Abhijit Chakra Points 1103

BroadcastReciever avec AlarmManager . C’est le meilleur moyen de planifier un appel sur le serveur pour l’environnement Android.

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