Intereting Posts

IntentService не будет показывать Toast

Этот 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! } } 

Solutions Collecting From Web of "IntentService не будет показывать Toast"

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

Принятый ответ неверен.

Вот как вы можете показать тост из 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!")); } } 

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

 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} отправляет сообщение обработчику по мертвой нити

Другим вариантом является RxJava , например:

 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(); } }); } 

Caveat : Я новичок в Android.