¿Por qué importa que el Toast se haga en Android si el contexto es el mismo?

Tengo un IntentService heredado que intenta utilizar los mensajes Toast para mostrar mensajes de error. 1 Me gustaría que los mensajes se mostraran, y han añadido código para que se pongan en el hilo correcto. El cambio más sencillo sería pasar el objeto Toast construido y luego mostrarlo en el subproceso de interfaz de usuario. Sin embargo, el Toast sólo se muestra si lo hago en el publicado ejecutables, no si paso en un Toast pre-hecho .

Esto funciona:

 @Override protected void onHandleIntent(Intent intent) { showToast("Error", Toast.LENGTH_LONG); } private void showToast(final String msg, final int duration) { new Handler(getMainLooper()).post(new Runnable() { @Override public void run() { // Make and show the toast in the posted runnable Toast.makeText(getApplicationContext(), msg, duration).show(); } }); } 

Esto no funciona :

 @Override protected void onHandleIntent(Intent intent) { // Make the toast here Toast myToast = Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG); showToast(myToast); } private void showToast(final Toast toast) { new Handler(getMainLooper()).post(new Runnable() { @Override public void run() { // Show the toast here toast.show(); } }); } 

En ambos casos, el contexto es el contexto de la aplicación, y no vi nada en la fuente que podría hacer que una versión funcione, pero la otra no. En cambio, este último tiene los mismos problemas que si el Toast se mostrara directamente en el IntentService: "Handler (android.os.Handler) {…} enviar mensaje a un Handler en un hilo muerto", Toast no desaparecer, etc.

¿Por qué el tostado tiene que hacerse en el hilo principal en lugar de sólo se muestra allí?

1. Legacy = No creo que mostrar mensajes de error en Toasts sea una gran interfaz de usuario, y no creo que los servicios que muestren mensajes directamente a los usuarios sean una buena idea, pero ese es el código que me entregaron y me gustaría hacerlo Este poco mejor.

En el segundo código que has publicado, el Toast se crea en el subproceso de fondo que tiene un looper y un controlador establecido (que es el punto de IntentService).

El tostado utiliza el looper del subproceso actual para crear un manejador, pero una vez que el IntentService termine de procesar el trabajo en onHandleIntent se detiene (si no hay otras intenciones de procesar), destruyendo el hilo que el manejador de Toast está confiando.

Línea 327: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/Toast.java

Hacer el brindis en el runnable funciona porque en ese momento, el hilo actual es el hilo de interfaz de usuario.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.