2012-09-04 4 views
0

J'ai une application Android, qui contient une activité principale qui affiche des informations à l'utilisateur. Lorsque l'activité principale démarre, un service est créé pour vérifier un service Web toutes les 10 secondes - si le retour WS répond, une notification est affichée. Il n'y a aucun lien entre l'activité principale et le service (sauf que je veux qu'ils commencent ensemble). le problème est que l'activité fonctionne très lentement - parce que le service fonctionne.Service Android qui s'exécute toutes les 10 secondes

Comment est-ce que je devrais le réparer? J'ai essayé d'utiliser IntentService mais il est mort après 10 secondes.

Le code J'utilise:

@Override 
public void onCreate() {  

super.onCreate(); 
context = this.getApplicationContext(); 
mPeriodicEventHandler = new Handler(); 
mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
} 

private Runnable doPeriodicTask = new Runnable() 
{ 
    public void run() 
    { 
     NotificationServices.Notification(); 
     mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
    } 
}; 
+0

10 secondes est vraiment rapide, et si la connexion est vraiment lente? – XepterX

+0

Utilisez-vous l'intention en attente pour notifier le service? – Dheepak

+0

@XepterX - Ceci est seulement POC donc il fonctionne sur notre laboratoire WiFi. – Shkolar

Répondre

0

votre gestionnaire exécute des tâches dans le thread principal de l'interface utilisateur, qui peut affecter votre activité de UI ou même causer des ANR.

Je vais suggérer de créer un nouveau HandlerThread et d'y poster votre tâche. Cependant, assurez-vous que vous voulez réellement extraire les données toutes les 10 secondes. C'est coûteux pour l'Internet mobile et la consommation d'énergie de l'appareil.

ou Persistent Connection Pensez à utiliser Google Cloud Messaging

+0

Hey, Ceci est POC - Nous voulons donc démontrer GCM et Polling. Dois-je créer le handlerThread dans le service? – Shkolar

+0

Oui. Créez un nouveau HandlerThread ("name"), appelez start(), attendez qu'il soit vraiment démarré (il y a un petit délai entre vous appelé start() et c'est vraiment arrivé), puis getLooper() à partir de ce thread. Après c'est fait - il suffit de créer votre gestionnaire avec le nouveau gestionnaire (thread.getLooper()) - à tout le reste du code fonctionnera correctement – AlexN

0

En utilisant Handler nous pouvons le faire

final Handler handler = new Handler(); 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       handler.postDelayed(r, 10000); 
      } 
     }; 
     handler.postDelayed(r, 0); 
0

Premier plan Référez-service Exemple de contrôleur API Demos et mise à jour en attente événement à chaque fois webservice est mis à jour.

Envisagez également d'utiliser Asynctask.

J'espère que cela aide :)

Questions connexes