Как создать тост из IntentService? Он застревает на экране

Я пытаюсь сделать так, чтобы моя IntentService показывала сообщение Toast, но при отправке его из сообщения onHandleIntent тост отображается, но застревает, а экран так и не уходит. Я предполагаю, что это потому, что метод onHandleIntent не выполняется в основном потоке службы, но как я могу его переместить?

Кто-нибудь имеет эту проблему и решил ее?


person Omri    schedule 17.10.2010    source источник
comment
Возможный дубликат тоста, созданного в IntentService, никогда не исчезнет   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 13.02.2016


Ответы (3)


в onCreate() инициализируйте Handler, а затем отправьте в него сообщение из своей беседы.

private class DisplayToast implements Runnable{
  String mText;

  public DisplayToast(String text){
    mText = text;
  }

  public void run(){
     Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
  }
}
protected void onHandleIntent(Intent intent){
    ...
  mHandler.post(new DisplayToast("did something")); 
}
person Nathan Schwermann    schedule 17.10.2010
comment
Для чего инициализирован ваш mContext? - person IgorGanapolsky; 04.10.2012
comment
Это ссылка на сервис. - person Nathan Schwermann; 04.10.2012
comment
приготовленный таким образом тост никуда не денется. есть ли что-нибудь, что я должен добавить, кроме приведенного выше кода? - person Yulong; 15.07.2013
comment
@Yulong, это интересная ошибка, вы всегда можете сохранить ссылку на тост и вызвать его метод cancel - person Nathan Schwermann; 15.07.2013
comment
@AvinashR, чтобы решить эту проблему, просто используйте конструктор Handler, который принимает Looper. mHandler = new Handler(Looper.getMainLooper()); - person Nathan Schwermann; 20.07.2014

Вот полный код класса IntentService, демонстрирующий тосты, которые мне помогли:

package mypackage;

import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

public class MyService extends IntentService {
    public MyService() { super("MyService"); }

    public void showToast(String message) {
        final String msg = message;
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        showToast("MyService is handling intent.");
    }
}
person Mike Shiyan    schedule 16.01.2016
comment
невозможно создать тост с использованием Application-Context ... вам нужно действие, чтобы делать такие вещи ... - person VallaDanger; 20.01.2017
comment
@VallaDanger Я предоставил фрагмент реального рабочего кода. - person Mike Shiyan; 31.01.2017

Используйте дескриптор, чтобы опубликовать Runnable, в котором содержится ваша операция.

protected void onHandleIntent(Intent intent){
    Handler handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
    public void run(){ 
        //your operation...
        Toast.makeText(getApplicationContext(), "hello world", Toast.LENGTH_SHORT).show();
    }  
}); 
person zuoke    schedule 04.02.2015