Cómo ejecutar un método cada X segundos

Estoy desarrollando una aplicación Android 2.3.3 y necesito ejecutar un método cada X segundos.

En iOS, tengo NSTimer , pero en Android no sé qué usar.

Alguien me ha recomendado Handler ; Otro me recomiendan AlarmManager pero no sé qué método se ajusta mejor con NSTimer .

Este es el código que quiero implementar en Android:

timer2 = [ NSTimer scheduledTimerWithTimeInterval:(1.0f/20.0f) target:self selector:@selector(loopTask) userInfo:nil repeats:YES ]; timer1 = [ NSTimer scheduledTimerWithTimeInterval:(1.0f/4.0f) target:self selector:@selector(isFree) userInfo:nil repeats:YES ]; 

Necesito algo que funciona como NSTimer .

¿Qué me recomiendan?

Esto realmente depende de cuánto tiempo aparte de que necesita para ejecutar la función.

Si es => 10 minutos → yo iría con el Administrador de alarmas.

 // Some time when you want to run Date when = new Date(System.currentTimeMillis()); try{ Intent someIntent = new Intent(someContext,MyReceiver.class); // intent to be launched // note this could be getActivity if you want to launch an activity PendingIntent pendingIntent = PendingIntent.getBroadcast( context, 0, // id, optional someIntent, // intent to launch PendingIntent.FLAG_CANCEL_CURRENT); // PendintIntent flag AlarmManager alarms = (AlarmManager) context.getSystemService( Context.ALARM_SERVICE); alarms.setRepeating(AlarmManager.RTC_WAKEUP, when.getTime(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent); }catch(Exception e){ e.printStackTrace(); } 

Y luego recibirá estas transmisiones a través de receptor de difusión. Tenga en cuenta que esto tendrá que ser registrado ether en su manifiesto de aplicación o vía context.registerReceiver(receiver,filter); Para obtener más información sobre los receptores de emisión, consulte los documentos oficiales. Receptor de radiodifusión .

 public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //do stuffs } } 

Si es = <10 minutos → yo iría con un manejador.

 Handler handler = new Handler(); int delay = 1000; //milliseconds handler.postDelayed(new Runnable(){ public void run(){ //do something handler.postDelayed(this, delay); } }, delay); 

Utilice el temporizador por cada segundo …

 new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() {} }, 0, 1000);//put here time 1000 milliseconds=1 second 

Intente este código para llamar al manejador cada 15 segundos y detenerlo cuando la actividad no sea visible

  Handler h = new Handler(); int delay = 15000; //15 seconds Runnable runnable; @Override protected void onStart() { //start handler as activity become visible h.postDelayed(new Runnable() { public void run() { //do something runnable=this; h.postDelayed(runnable, delay); } }, delay); super.onStart(); } @Override protected void onPause() { h.removeCallbacks(runnable); //stop handler when activity not visible super.onPause(); } 

Si está familiarizado con RxJava, puede utilizar Observable.interval (), que es bastante ordenado.

 Observable.interval(60, TimeUnits.SECONDS) .flatMap(new Function<Long, ObservableSource<String>>() { @Override public ObservableSource<String> apply(@NonNull Long aLong) throws Exception { return getDataObservable(); //Where you pull your data } }); 

La desventaja de esto es que usted tiene que el arquitecto de sondeo sus datos de una manera diferente. Sin embargo, hay muchos beneficios para la forma de programación reactiva:

  1. En lugar de controlar sus datos a través de una devolución de llamada, crea una secuencia de datos a la que se suscribe. Esto separa la preocupación de la lógica de "datos de sondeo" y la lógica de "rellenar la interfaz de usuario con los datos" para que no mezcle su código de "fuente de datos" y su código de interfaz de usuario.
  2. Con RxAndroid, puede manejar subprocesos en sólo 2 líneas de código.

     Observable.interval(60, TimeUnits.SECONDS) .flatMap(...) // polling data code .subscribeOn(Schedulers.newThread()) // poll data on a background thread .observeOn(AndroidSchedulers.mainThread()) // populate UI on main thread .subscribe(...); // your UI code 

Por favor, echa un vistazo a RxJava. Tiene una alta curva de aprendizaje pero hará que el manejo de llamadas asíncronas en Android sea mucho más fácil y más limpio.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.