English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Método de solución de problemas de que el Toast no se muestra correctamente en Android Service

Este artículo expone la solución al problema de que Toast no se muestra correctamente en el Service de Android. Comparto esto con todos ustedes para que lo puedan referenciar, como se detalla a continuación:

Al hacer un ejercicio simple de Service, se llamó a Toast.makeText en los métodos OnCreate, OnStart y OnDestroy del Service de la misma manera que se haría en un Activity, y se llamó a los métodos onStart y onDestroy del servicio a través de dos botones en el Activity:

El código de DemoService es el siguiente:

@Override
public void onCreate()
{
    super.onCreate();
    Toast.makeText(getApplicationContext(), "¡El servicio se ha creado!", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startId)
{
    super.onStart(intent, startId);
    Toast.makeText(getApplicationContext(), "¡El servicio está activo!", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy(){
    super.onDestroy();
    Toast.makeText(getApplicationContext(), "¡El servicio está apagado!", Toast.LENGTH_LONG).show();
}

Después de ejecutarlo, no se mostraron las informações en DemoService.

Al principio, se creía que el Context obtenido no era correcto, ya que al llamar directamente getApplicationContext() en el Service, se obtiene el Context del Service. Pero al investigar más, se descubrió que Toast debería obtener el Context de la UI principal para poder mostrarse, por lo que se buscó y se encontró una frase en la descripción de Toast de Google:

“Un toast se puede crear y mostrar desde un Activity o Servicio. Si crea una notificación toast desde un Servicio, aparecerá delante del Activity actualmente en foco.”
(http://developer.Android.com/guide/topics/ui/notifiers/toasts.html)

Entonces, según esta frase, el toast creado en el servicio se mostrará delante del Activity en foco. Pero ¿por qué no tiene efecto al ejecutarse? Vamos a ver el método makeText.

¡Claro, es un problema de Contexto! Por lo tanto, para que el toast funcione correctamente, debe ejecutarse en la línea principal del Activity. Entonces, ¿cómo obtener el Contexto de la UI de la línea principal? A través de un Handler, se puede ejecutar un hilo personalizado en la línea principal.

Vamos a ver ahora el src de Toast.show método:

public void show() {
    ...
    service.enqueueToast(pkg, tn, mDuration);  //Insertar este toast en una cola de mensajes
    ...
}

En principio, en Android se trata básicamente de una cola de mensajes y un bucle de mensajes, donde la línea principal obtiene mensajes de la cola de mensajes y los procesa. Mientras que Handler se considera una clase de herramienta, utilizada para insertar mensajes en la cola de mensajes. Por lo tanto, reformulamos el código original:

@Override
public void onCreate()
{
    super.onCreate();
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "¡El servicio se ha creado!", Toast.LENGTH_LONG).show();
      }
    });
}
@Override
public void onStart(Intent intent, int startId)
{
    super.onStart(intent, startId);
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "¡El servicio está activo!", Toast.LENGTH_LONG).show();
      }
    });
}
@Override
public void onDestroy(){
    super.onDestroy();
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "¡El servicio está apagado!", Toast.LENGTH_LONG).show();
      }
    });
}

El efecto después de ejecutarlo es el siguiente:

Resumen:Para que Toast funcione correctamente en el Framework de Android, debe agregarlo a la línea principal.

Los lectores interesados en más contenido relacionado con Android pueden consultar la sección especial de este sitio: 'Introducción y tutorial avanzado de desarrollo de Android', 'Resumen de técnicas de vista View de Android', 'Resumen de técnicas de operación de activity en Android', 'Resumen de técnicas de operación de base de datos SQLite en Android', 'Resumen de técnicas de operación de datos en formato JSON en Android', 'Resumen de técnicas de operación de base de datos en Android', 'Resumen de técnicas de operaciones de archivos en Android', 'Resumen de métodos de operación de tarjeta SD en desarrollo de Android', 'Resumen de técnicas de operaciones de recursos en Android' y 'Resumen de técnicas de uso de controles en Android'

Espero que lo descrito en este artículo pueda ayudar a todos en el diseño de programas Android.

Declaración: El contenido de este artículo se obtiene de la red, pertenece a los propietarios originales, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará