Android Toast started from Service only displays once

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

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 

回答1:

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 


回答2:

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



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!