我有一个监视套接字连接的服务。当连接丢失时,它需要显示Toast通知用户它正在重新连接。这第一次工作正常。之后我在日志中看到了enqueueToast,但是没有显示toast。任何想法都表示赞赏。我认为这很容易添加,但我必须遗漏一些东西。
日志条目
INFO / NotificationService(118):enqueueToast pkg = com.abc callback=android.app.ITransientNotification$Stub$Proxy@43f7b100 持续时间= 1
调用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 :(得分:12)
是的,你可以选择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
答案 1 :(得分:7)
这是解决方案
http://www.jjoe64.com/2011/09/show-toast-notification-from-service.html
您必须在Handler
方法中创建onStartCommand
。然后,在onHandleIntent
方法中,您可以创建并显示Toast通知