2010-10-26 3 views
9

J'ai un service qui surveille une connexion socket. Lorsque la connexion est perdue, elle doit afficher un Toast informant l'utilisateur qu'il se reconnecte. Cela fonctionne bien la première fois. Après cela, je vois le enqueueToast dans le journal mais le toast n'est pas affiché. Toutes les idées sont appréciées. Je pensais que cela allait être facile à ajouter, mais il me manque quelque chose.Android Toast démarré à partir du service affiche uniquement une fois

entrée de journal

INFO/NotificationService (118): enqueueToast pkg = com.abc [email protected] durée = 1

code qui appelle la Toast

public class ConnectionService extends Service 
{ ..... 

public void restartConnection() 
{ 
    try 
    { 
    Log.i(this.toString(), "Attempting to reconnect..."); 

    // increase the wait between each retry until the max is reached 
    int sleepTime = reconnectCounter * MIN_RECON_WAIT; 

    if (sleepTime > MAX_RECON_WAIT) 
    { 
     sleepTime = MAX_RECON_WAIT; 
    } 

    String msg = "The connection has been lost. Restart attempt will start in: " + sleepTime/1000 + " seconds"; 

    Log.i(this.toString(), msg); 
    Toast.makeText(getApplicationContext(), msg , Toast.LENGTH_LONG).show(); 

    Thread.sleep(sleepTime); 

    // increment the counter 
    reconnectCounter++; 

    this.startConnectionThread(); 

    } 
    catch (Exception e) 
    { 
     Log.e(this.toString(), "Exception: " + e.toString()); 
     e.printStackTrace(); 
    } 
}// end retartConnection 
+0

C'est probablement un problème de threading. Appelez-vous Toast.show() à partir du thread d'interface utilisateur ou d'un thread séparé? Pourriez-vous donner un peu plus de contexte à cette méthode. – Vuk

+0

Appelé à partir d'une classe Service qui a été démarrée par un appel bindService à partir de l'activité qui est affichée en premier à l'utilisateur. J'espérais utiliser un appel runOnUiThread pour montrer le toast, mais je n'arrivais pas à comprendre comment l'utiliser dans le Service. – bursk

Répondre

12

Ouais, vous pouvez aller avec le runOnUiThread, c'est une façon légitime.
En outre, vous pouvez essayer l'alternative Handler. De toute façon, ça devrait marcher.

Voici un code du haut de ma tête. Je n'ai pas le SDK maintenant pour le tester mais je pense qu'il devrait vous donner une idée générale.

public class ConnectionService extends Service { 
    private Handler handler = new Handler(); 

    public void restartConnection(){ 
    int sleepTime = reconnectCounter * MIN_RECON_WAIT; 
    if (sleepTime > MAX_RECON_WAIT) 
    { 
     sleepTime = MAX_RECON_WAIT; 
    } 
    String msg = "The connection has been lost. Restart attempt will start in: " + sleepTime/1000 + " seconds"; 
    (new Timer()).schedule(
    new TimerTask() { 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
       Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show(); 
       reconnectCounter++; 
       this.startConnectionThread() 
       } 
      }); 
     } 
    }, sleepTime); 
    }//end restartConnection 

}//end ConnectionService 
+0

wow! Juste ce dont j'avais besoin, merci beaucoup! – bursk

+1

ce n'est pas une bonne solution. De mieux en mieux: http://www.jjoe64.com/2011/09/show-toast-notification-from-service.html – appsthatmatter

+0

Merci pour cet article utile! – Warwicky

Questions connexes