2012-09-19 10 views
8

Possible Duplicate:
Android Toast started from Service only displays onceerror llamando a la tostada del servicio Android

estoy usando Android Servicio definido en android.app.Service.

Llamo a este servicio (myService) de una actividad.

MyService es:

public class myService extends Service{ 

public IBinder onBind(Intent intent){ 
    return null; 
} 

public void onCreate(){ 
    super.onCreate(); 
    TimerTask task = new TimerTask(){ 
     public void run(){ 
      Log.i("test","service running"); 
      checkDate();    
     }   
    }; 
    timer = new Timer(); 
    timer.schedule(task, 0, 20000); 
} 

public void checkDate(){ 
    Toast toast = Toast.makeText(this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); 
    toast.show(); 
} 

} 

El checkdate método() reside en el myService clase.

El error producido es:

09-19 15:41:35.267: E/AndroidRuntime(2026): FATAL EXCEPTION: Timer-0 
09-19 15:41:35.267: E/AndroidRuntime(2026): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
09-19 15:41:35.267: E/AndroidRuntime(2026): at android.os.Handler.<init>(Handler.java:121) 
09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast$TN.<init>(Toast.java:310) 
09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast.<init>(Toast.java:84) 
09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast.makeText(Toast.java:226) 
+0

Se puede publicar el código que se utiliza para iniciar esto? ¿También es este un servicio real de Android o es solo un hilo de fondo? El problema es que no puede interactuar con la interfaz de usuario desde un hilo de fondo. Si tiene una referencia al contexto de la actividad, puede llamar a runOnUIThread usando ese contexto. – Bobbake4

Respuesta

23

TimerTask carreras en un hilo separado. Toast.makeText() debe ejecutarse desde un hilo que ha establecido un Handler/Looper. Básicamente, esto significa que necesita hacer un brindis en un hilo que tiene el despachador de mensaje/evento Android estándar que se ejecuta en él.

La manera más fácil de hacer esto sería en su método checkDate():

runOnUiThread(new Runnable() { 
    public void run() { 
     Toast toast = Toast.makeText(this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
}); 

EDIT: Soy un idiota, eso no es correcto. No puede llamar a runOnUiThread() desde un contexto de servicio

. Necesita utilizar un controlador para esto. En su servicio:

private Handler handler; 

en onCreate() de su servicio:

handler = new Handler(); 

en checkDate() método:

handler.post(new Runnable() { 
    public void run() { 
     Toast toast = Toast.makeText(myService.this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
}); 
+0

Intenté esto, pero devuelvo este error: El método runOnUiThread (nuevo Runnable() {}) no está definido para el tipo myService – GVillani82

+0

Lo siento, soy un idiota. He editado mi publicación en consecuencia. Necesita usar un controlador para esto. –

+0

Ok. Solo hay otro problema en "makeText": El método makeText (Context, CharSequence, int) en el tipo Toast no es aplicable para los argumentos (new Runnable() {}, String, int) – GVillani82

4

que está llamando desde un subproceso de trabajo. Debe llamar a Toast.makeText() (y a la mayoría de las demás funciones relacionadas con la IU) desde el hilo principal. Podría usar un controlador, por ejemplo.

es necesario llamar a Toast.makeText (...) desde el subproceso de interfaz de usuario:

activity.runOnUiThread(new Runnable() { 
    public void run() { 
    Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

+1 Ooops, me ganaste. –

+0

Si intento esto obtengo este error: No puedo hacer una referencia estática al método no estático runOnUiThread (Runnable) del tipo Actividad – GVillani82

+2

Sí, esto no funciona a menos que tenga un contexto de actividad, que no tiene . –

Cuestiones relacionadas