¿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:
- Tostada en AsyncTask en la clase Non Activity
- Cómo mostrar Toast en Android?
- Notificaciones de Toast que no aparecen en Nexus 7 Tablet
- Mostrar tostada compleja de BroadcastReceiver
- El método makeText en el tipo Toast no es aplicable para los argumentos
@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.
- Llamar a getLayoutInflater () en lugares que no están en actividad
- Obtener contexto en AsyncTask
- Aviso de notificación de brindis con la reciente actualización del dispositivo en Android
- Tostada no funciona
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.
Hacer el brindis en el runnable funciona porque en ese momento, el hilo actual es el hilo de interfaz de usuario.