Android Toast запущен из Сервиса отображается только один раз

У меня есть служба, которая контролирует сокет соединения. Когда соединение потеряно, он должен отобразить тост, информирующий пользователя о том, что он повторно подключается. Это отлично работает в первый раз. После этого я вижу enqueueToast в журнале, но тост не отображается. Любые идеи приветствуются. Я думал, что это будет легко добавить, но я должен что-то упустить.

Запись в журнале

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

Код, который вызывает тост

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

2 ответа

Решение

Да, вы можете пойти с runOnUiThread, это законный путь.
Кроме того, вы можете попробовать альтернативу Handler. В любом случае это должно работать.

Вот код из верхней части моей головы. У меня сейчас нет SDK для тестирования, но я думаю, что он должен дать вам общее представление.

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

Вот решение

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

Вы должны создать Handler в onStartCommand метод. И в onHandleIntent метод, который вы можете затем создать и показать уведомление о тосте

Другие вопросы по тегам