Android: ejecuta el código en intervalos regulares

Necesito realizar algún código en intervalos regulares (conectarme a un servidor y extraer datos de la base de datos MySQL cada minuto). Para este propósito tengo una clase Sync:

public class Sync { static private Handler handler = new Handler(); Runnable task; public Sync(Runnable task, long time) { this.task = task; handler.removeCallbacks(task); handler.postDelayed(task, time); } } 

y en mi actividad tengo:

 public void onCreate(Bundle savedInstanceState) { ... Sync sync = new Sync(call,60*1000); ... } final private Runnable call = new Runnable() { public void run() { //This is where my sync code will be, but for testing purposes I only have a Log statement Log.v("test","this will run every minute"); } }; 

Lo intenté con un período de tiempo más corto para las pruebas, pero solo se ejecuta una vez. Cuando registra el mensaje por primera vez, también es el último. ¿Alguien ve lo que estoy haciendo aquí? ¡Gracias!

Puedes hacerlo usando el siguiente código, ¡Espero que ayude!

 final Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { try{ //do your code here } catch (Exception e) { // TODO: handle exception } finally{ //also call the same runnable to call it at regular interval handler.postDelayed(this, 1000); } } }; //runnable must be execute once handler.post(runnable); 

Primero debe declarar el manejador globalmente. Segundo, debe usar el método posretraso nuevamente en el ejecutable para volver a activarlo.

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Sync sync = new Sync(call,60*1000); } final private Runnable call = new Runnable() { public void run() { //This is where my sync code will be, but for testing purposes I only have a Log statement Log.v("test","this will run every minute"); handler.postDelayed(call,60*1000); } }; public final Handler handler = new Handler(); public class Sync { Runnable task; public Sync(Runnable task, long time) { this.task = task; handler.removeCallbacks(task); handler.postDelayed(task, time); } } } 

handler.postDelayed(task, time); solo se ejecutará una vez; si desea que el código se active a intervalos regulares, sugeriría un Timer y un TimerTask lugar de un Handler y un Runnable .

TimerTasks se puede configurar para que se ejecute una vez, cada x segundos o con un período fijo, por ejemplo, x segundos, sin TimerTasks tiempo que tardó en ejecutarse la última vez.

  private void doSomethingRepeatedly() { timer.scheduleAtFixedRate( new TimerTask() { public void run() { try{ //Your code } catch (Exception e) { // TODO: handle exception } } }, 0, 10000); } 

Una forma alternativa, usando scheduleAtFixedRate de ScheduledExecutorService :

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beepEvery10Seconds() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } }; final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate(beeper, 0, 10, SECONDS); }