2010-09-29 8 views
29

Tengo problemas para ejecutar un temporizador en un servicio que he creado. La tarea que llama el temporizador simplemente no se llama. Sé que el servicio comienza cuando he puesto brindis dentro de él y se llaman, pero no cuando están dentro del temporizador. Ayuda apreciada.Android Timer dentro de un servicio

clase de servicio:

public class LocalService extends Service 
{ 
    private static Timer timer = new Timer(); 
    private Context ctx; 

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

    public void onCreate() 
    { 
      super.onCreate(); 
      ctx = this; 
      startService(); 
    } 

    private void startService() 
    {   
     timer.scheduleAtFixedRate(new mainTask(), 0, 5000); 
    } 

    private class mainTask extends TimerTask 
    { 
     public void run() 
     { 
      Toast.makeText(ctx, "test", Toast.LENGTH_SHORT).show(); 
     } 
    }  

    public void onDestroy() 
    { 
      super.onDestroy(); 
      Toast.makeText(this, "Service Stopped ...", Toast.LENGTH_SHORT).show(); 
    }  
} 

Clase principal:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    startService(new Intent(RingerSchedule.this, LocalService.class));  
} 

Respuesta

49

Android no permite eventos de interfaz de usuario, como tostadas desde fuera del hilo principal. Se ejecuta la ejecución, pero Toast se ignora.

Para crear la tostada en el subproceso de interfaz de usuario, se puede utilizar un Handler y un mensaje vacío de este modo:

public class LocalService extends Service 
{ 
    private static Timer timer = new Timer(); 
    private Context ctx; 

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

    public void onCreate() 
    { 
      super.onCreate(); 
      ctx = this; 
      startService(); 
    } 

    private void startService() 
    {   
     timer.scheduleAtFixedRate(new mainTask(), 0, 5000); 
    } 

    private class mainTask extends TimerTask 
    { 
     public void run() 
     { 
      toastHandler.sendEmptyMessage(0); 
     } 
    }  

    public void onDestroy() 
    { 
      super.onDestroy(); 
      Toast.makeText(this, "Service Stopped ...", Toast.LENGTH_SHORT).show(); 
    } 

    private final Handler toastHandler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_SHORT).show(); 
     } 
    };  
} 
+0

Gracias , trabajó. – Woody

+0

Exactamente la respuesta correcta. – Nakedible

+0

estaba buscando esta respuesta por mucho tiempo. – santBart

0

Gracias, también es necesario para cancelar el temporizador ..

public void onDestroy() { 
     timer.cancel(); 
     Toast.makeText(this, "ServiceTalkGeology stopped.", 
     Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
}