IntentService не будет показывать тост - PullRequest
25 голосов
/ 18 марта 2011

Этот IntentService, который я создал, будет отображать тосты в onStartCommand () и onDestroy (), но не в onHandleIntent ()Я что-то упускаю из-за ограничений IntentService?

public class MyService extends IntentService {

private static final String TAG = "MyService";

public MyService(){
    super("MyService");
}

@Override
protected void onHandleIntent(Intent intent) {
    cycle();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); //This happens!
    return super.onStartCommand(intent,flags,startId);
}

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public void onDestroy() {
    Toast.makeText(this, "service stopping", Toast.LENGTH_SHORT).show(); //This happens!
    super.onDestroy();
}

private void cycle(){
      Toast.makeText(this, "cycle done", Toast.LENGTH_SHORT).show();  //This DOESN'T happen!
      Log.d(TAG,"cycle completed"); //This happens!
}
}

Ответы [ 4 ]

66 голосов
/ 19 декабря 2013

Принят неправильный ответ.

Вот как вы можете показать тост из onHandleIntent():

Создание класса DisplayToast :

public class DisplayToast implements Runnable {
    private final Context mContext;
    String mText;

    public DisplayToast(Context mContext, String text){
        this.mContext = mContext;
        mText = text;
    }

    public void run(){
        Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
    }
}

Создайте Handler в конструкторе вашего сервиса и вызовите метод post с объектом DisplayToast внутри.

public class MyService extends IntentService {
Handler mHandler;

public MyService(){
    super("MyService");
    mHandler = new Handler();
}

@Override
protected void onHandleIntent(Intent intent) {
    mHandler.post(new DisplayToast(this, "Hello World!"));

}
}
23 голосов
/ 04 февраля 2015

Вы должны запустить тост в главном потоке:

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

Это связано с тем, что в противном случае поток IntentService завершает работу перед отправкой тоста, вызывая исключение IllegalStateException:

java.lang.IllegalStateException: обработчик (android.os.Handler) {12345678}, отправляющий сообщение обработчику в мертвом потоке

19 голосов
/ 18 марта 2011

onHandleIntent () вызывается из фонового потока (именно для этого и предназначен IntentService), поэтому вам не следует создавать там пользовательский интерфейс.

3 голосов
/ 13 января 2015

Другой вариант - RxJava , например ::100100

private void showToast(final String text) {
    Observable.just(text)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
            }
        });
}

Предостережение : Я новичок в Android.

...