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
метод, который вы можете затем создать и показать уведомление о тосте