9

I have a service that monitors a socket connection. When the connection is lost it needs to display a Toast informing the user that it is reconnecting. This works fine the first time. After that I see the enqueueToast in the log but the toast is not displayed. Any ideas are appreciated. I thought this was going to be an easy thing to add, but I must be missing something.

Log entry

INFO/NotificationService(118): enqueueToast pkg=com.abc callback=android.app.ITransientNotification$Stub$Proxy@43f7b100 duration=1

Code that calls the 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
Fedor
  • 43,261
  • 10
  • 79
  • 89
bursk
  • 1,647
  • 7
  • 25
  • 39
  • It's a threading issue probably. Are you calling Toast.show() from the UI thread or from a separate one? Could you give a bit more context to this method. – Vuk Oct 26 '10 at 16:12
  • This called from within a Service class that has been started by a bindService call from the Activity that is first displayed to the user. I was hoping to use a runOnUiThread call to show the toast, but I couldn't figure out how to use that in the Service. – bursk Oct 26 '10 at 16:27

2 Answers2

12

Yeah, you could go with the runOnUiThread, that's a legit way.
Also, you could try the Handler alternative. Either way it should work.

Here is some code from the top of my head. I don't have the SDK now to test it but I think it should give you a general idea.

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
Vuk
  • 1,225
  • 12
  • 15
7

here is the solution

http://www.jjoe64.com/2011/09/show-toast-notification-from-service.html

you have to create a Handler in the onStartCommand method. And in the onHandleIntent method you can then create and show a toast notification

appsthatmatter
  • 6,347
  • 3
  • 36
  • 40