IntentService no mostrará Toast

Este IntentService que he creado mostrará Toasts en onStartCommand () y en onDestroy (), pero no en onHandleIntent (). ¿Estoy perdiendo algo sobre las limitaciones de un 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! } } 

OnHandleIntent () se llama desde un hilo de fondo (que es lo que IntentService es todo), por lo que no debe hacer la interfaz de usuario desde allí.

La respuesta aceptada no es correcta.

Aquí es cómo se puede mostrar brindis de onHandleIntent() :

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

Instantiate un Handler en el constructor de su servicio y llame al método post con un objeto DisplayToast dentro.

 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!")); } } 

Usted debe comenzar el brindis en el hilo principal:

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

Esto se debe a que de lo contrario el subproceso de IntentService se cierra antes de que el brindis se puede enviar, provocando una IllegalStateException:

Java.lang.IllegalStateException: Handler (android.os.Handler) {12345678} enviar mensaje a un Handler en un hilo muerto

Otra opción es RxJava , por ejemplo:

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

Advertencia : Soy nuevo en Android.

  • ¿Cómo mostrar Toast de un Servicio después de que la actividad principal termine?
  • ¿Hay código para Snackbars en Android L o se espera que los implementemos nosotros mismos?
  • Los bordes del diálogo Toast y Progress se cortan
  • ¿Se puede usar OnClickListener con un brindis?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.