Estoy teniendo problemas al ejecutar un temporizador en un servicio que acabamos de crear. La tarea que el temporizador de llamadas, simplemente, no se llama. Sé que el servicio se inicia como he puesto tostadas dentro de ella y que son los llamados, pero no cuando están en el temporizador. Ayuda apreciada.

de la 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));      
}   
  • Cómo detener el temporizador ?
InformationsquelleAutor | 2010-09-29

2 Comentarios

  1. 53

    Android no permite que los eventos de interfaz de usuario como las Tostadas de fuera del hilo principal. La carrera está recibiendo la llamada, pero el pan Tostado está siendo ignorada.

    Para crear el Brindis en el subproceso de interfaz de usuario, puede utilizar un Controlador y un Mensaje vacío así:

    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();
            }
        };    
    }
    • yo estaba buscando esta respuesta por mucho tiempo.
    • No es necesario tener una estática Handler con un WeakReference para evitar fugas?
    • Este es un gran «gracias». ¿Cómo puedo pasar al servicio de una variable de tipo int en lugar de los 5000 para la millis? Quiero ser capaz dinámicamente/programattically ajustar el temporizador de intervalo.
  2. 2

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

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

Dejar respuesta

Please enter your comment!
Please enter your name here