2010-10-26 11 views
9

Tengo un servicio que supervisa una conexión de socket. Cuando se pierde la conexión, debe mostrarse un Toast informando al usuario que se está reconectando. Esto funciona bien la primera vez. Después de eso, veo el enqueueToast en el registro, pero la tostada no se muestra. Cualquier idea es apreciada. Pensé que esto sería una cosa fácil de agregar, pero debo estar perdiendo algo.Toast de Android iniciado desde el servicio solo muestra una vez

entrada de registro de

INFO/NotificationService (118): enqueueToast PKG = com.abc [email protected] duración = 1

Código que llama al pan tostado

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

Probablemente sea un problema de enhebrado. ¿Estás llamando a Toast.show() desde el hilo de UI o desde uno separado? ¿Podría dar un poco más de contexto a este método? – Vuk

+0

Llamado desde dentro de una clase de servicio que se inició con una llamada bindService desde la actividad que se muestra primero al usuario. Esperaba usar una llamada runOnUiThread para mostrar el brindis, pero no pude encontrar la manera de usar eso en el Servicio. – bursk

Respuesta

12

Sí, usted podría ir con el runOnUiThread, que es una manera de fiar.
Además, podría probar la alternativa de Manejador. De cualquier manera, debería funcionar.

Aquí hay un código de la parte superior de mi cabeza. No tengo el SDK ahora para probarlo, pero creo que debería darte una idea general.

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

¡guau! Justo lo que necesitaba, ¡muchas gracias! – bursk

+1

esa no es una buena solución. Mejor y más fácil: http://www.jjoe64.com/2011/09/show-toast-notification-from-service.html – appsthatmatter

+0

¡Gracias por la útil publicación! – Warwicky

Cuestiones relacionadas